c++模板类在继承中子类无法访问父类的成员

c++模板类在继承中子类无法访问父类的成员


问题:c++模板类在继承中子类无法访问父类的成员
解决方法:在子类访问父类时加上父类的前缀或使用this->调用

c++从入门到放弃,感觉c++了解的越多,就越不会(心累啊)
最近在写一套数据结构的模板库,遇到了很多问题,比如头文件的重复引入,定义等等,这次说说新遇到的问题,模板类的继承中子类无法访问父类的成员,
子类不能访问父类的成员在VC++中可以编译通过,而用g++就会报错

先列出我查过的资源,要转载的话注意作者的版权
1. https://www.zhihu.com/question/28139230
2. https://bbs.csdn.net/topics/391862079
3. https://blog.csdn.net/u012175089/article/details/54231791

template <class T>
class Base{
public:
    T data;
    void display();
};
template <class T>
class Derive:public Base<T>{
    void show(){cout << data;}
};
//上面的代码无法编译通过,子类无法访问基类的成员变量或成员函数,
//用this访问即可,也可以直接在成员前家基类的名字Base<T>::

1.对于两个非模板继承是可直接继承.
2.对于模板类继承非模板类时,在模板声明进行解析的时候就会进行查找
3.对于继承父类是模板类的会进行名称二次查找

 模板定义阶段:刚被定义时,只有模板中独立的名字(可以理解为和模板参数无关的名字)参加查找
 模板实例化阶段:实例化模板代码时,非独立的名字才参加查找。
 //一个模板子类其实是不能在实例化之前就知道他的模板父类到底是谁,所以只能this->了

c++ 两阶段名字查找,对于非依赖模板名称的都是现场决议的,编译器不查找基类 scope,没找到就报错,编译器不查找基类,因为此时基类还是个类模板,到底是什么东西还不定呢。
然后实例化的时候进行第二阶段名字查找,这时候所有类型都是确定的,才能够查找基类 scope。
增加 this 或 Base:: 就是把对 function 的查找延迟到第二阶段,这是 c++ 标准规定的。
这里有一个带栗子的博客,可以看看比较详细:二次查找的栗子
c++继承中名字的查找

  • 33
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

siyan985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值