c++模板类在继承中子类无法访问父类的成员
2018-03-23 17:58
267 查看
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++继承中名字的查找
相关文章推荐
- C++ 类的继承,子类以及之类的对象 对父类成员函数的访问权限
- 关于模板类中,子类无法访问父类成员问题的解决方法
- C++中子类对父类成员的访问
- C++ 中有没有不能被子类继承的父类成员?
- C++中指向子类的父类指针访问父、子类成员时的权限和函数隐藏规则
- public继承后,父类与子类访问隐藏 熟练c/c++(三)
- C++和Java在 子类继承父类时,两者成员函数重写和重载的特性
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
- C++ 子类能不能改变父类中成员的访问权限?
- C++和Java在 子类继承父类时,两者成员函数重写和重载的特性
- C++多级继承子类访问“爷爷类”同名成员
- c++子类能从父类中继承父类的静态成员函数吗
- c++中继承 掩藏基类成员,访问父类对比c#
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
- C++中父类成员变量和子类成员变量重复定义及访问方法的深入探究
- 关于protected在子类创建父类对象无法访问父类protected方法或成员
- C++继承时子类父类同名成员变量的问题
- Java中子类的基本继承方法,子类通过继承父类public方法,访问父类private成员
- C++子类访问父类protected成员
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象