使用模板时,继承不起作用

inheritance doesn't work as it should when using templates

本文关键字:继承 不起作用      更新时间:2023-10-16

我有一个继承问题。我创建这个例子是为了或多或少地展示我的问题。问题是,如果我公开地从一个公开地从一个类派生出来的类派生出来,那么我必须一直访问原始类中的受保护成员。但是,当我使用模板时,情况似乎不是这样。

实际上,下面的例子在'n++;'的那一行抱怨说'n'没有在作用域中声明。但是,如果我不使用模板。代码编译得很好。发生了什么事?

#include<iostream>
template<typename T> 
class base{
 protected:
    T n;
 public:
    T getn();
    base();
};
template<typename T>  
T base<T>::getn(){
   return n; 
}
template<typename T> 
base<T>::base(){
   n = 8; 
}
template<typename T> 
class daddy: public base<T>{
protected: 
public:
};
template<typename T>
class granny: public daddy<T>{
protected:
public:
    T plusone();
};
template<typename T> 
T granny<T>::plusone(){ 
    //this->n = this->n + 1;
   n++;
   return n;
}
int main(){
   granny<int> oldmommy;
   int su = oldmommy.getn();   
   std::cout << su << std::endl;
   su = oldmommy.plusone();
   std::cout << "plusone" << su << std::endl;
   return 0;
}

顺便说一句。告诉我,如果我应该张贴没有模板的代码比较..

一个快速的修复方法是在变量:

之前应用this
 this->n = this->n + 1;
 return this->n;

原因是编译器没有对模板基类成员(在本例中是n,它依赖于类型T)做任何假设,以防基类的部分特化不包括这些成员。

n在这里是一个从属名称。你必须明确地指出n来自哪里,否则编译器不知道你引用的是哪个n(注意,可能有一些base专门化没有名为n的成员)。

你可以使用:

this->n;

或:

base<T>::n;

代替代码中的n