条款43:学习处理模板化基类的名称
来源:互联网 发布:社交软件的英文 编辑:程序博客网 时间:2024/05/21 12:50
先看程序:
class A{public:void funcA(){cout<<"funcA"<<endl;}};template<typename T>class UseA{public:void useAFunc(){T a;a.funcA();}};template<typename T>class DrivedUseA:public UseA<T>{public:void DrivedUseAFunc(){useAFunc();}};int main(){DrivedUseA<A> d;d.DrivedUseAFunc();return 0;}
这段程序在vc++6.0和vs2010下是没有问题的,但是在有的编译器(g++,还有一些在线编译器)上会报错。原因是因为当编译器遇见DrivedUseA时,并不知道他继承自什么类,直到基类UseA被实例化以后他才知道。而如果他不知道是通过class A实例化的,自然就不知道基类的函数具体是什么了。有3个方法可以解决这个问题:
1.在基类函数调用动作之前加上this->:this->useAFunc();
2.使用using声明:
template<typename T>class DrivedUseA:public UseA<T>{public:using UseA<T>::useAFunc;void DrivedUseAFunc(){useAFunc();}};
3.明确指出被调函数位于基类中:
template<typename T>class DrivedUseA:public UseA<T>{public:void DrivedUseAFunc(){UseA<T>::useAFunc();}}但是第三种办法有明显的缺陷:显示指明调用基类函数会是得动态绑定不会发生。
其实,它们做的事情都是相同的:对编译器承诺基类模板的任何特化版本都将支持其泛化版本所提供的接口。
总之可以在派生类中通过this指针或者using声明来告诉派生类使用的是基类的函数。
- 条款43:学习处理模板化基类的名称
- 条款43:学习处理模板化基类内的名称
- 条款43:学习处理模板化基类内的名称
- 条款43:学习处理模板化基类内的名称
- 条款43:学习处理模板化基类内的名称
- Effective C++:条款43:学习处理模板化基类内的名称
- 《Effective C++》:条款43:学习处理模板化基类内的名称
- 条款43:学习处理模板化基类内的名称
- Effective C++学习笔记_条款43:学习处理模板化基类内的名称
- Effective C++笔记_条款43 学习处理模板化基类内的名称
- 读书笔记《Effective C++》条款43:学习处理模板化基类内的名称
- 条款43、学习处理模版化基类内的名称
- Effective C++ Item 43 学习处理模板化基类内的名称
- C++之 模板化基类 的名称处理
- C++之学习处理模板化基类内的名称(43)---《Effective C++》
- Effective C++ 43条 处理模板化基类内的名称
- 《Effective C++》读书笔记之item43:学习处理模板化基类内的名称
- 《Effective C++》学习笔记条款33 避免遮掩继承而来的名称
- VB导出EXCEL
- linux ipcs 命令详解
- UVa 10986 - Sending email (Dijkstra优化, SPFA)
- C# 生成Excel插入图表
- 插入耳机时播放音乐,铃声和闹钟,音乐没有声音的问题解决
- 条款43:学习处理模板化基类的名称
- Maven多模块项目管理小结
- 关于登录sql server 2005 出现“已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程”的问题
- SqlServer2005 建立索引
- 在汇编中引用C语言中的结构体
- Android Training - 使用OpenGL ES(1) - 构建OpenGL ES环境
- JS注入原理
- POJ 2238 && HDU 4294
- C# create excel