博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ 条款43
阅读量:7139 次
发布时间:2019-06-28

本文共 2170 字,大约阅读时间需要 7 分钟。

学习处理模板化基类里的名称

本节作者编写的意图在我看来能够总结成一句话,就是“怎样定义并使用关于模板类的派生过程,怎样处理派生过程出现的编译不通过问题”。

以下我们看一段说明性的代码:

#include
using namespace std;class object1{public: void get(){ cout << "object1"; } void out(){ cout << "out1"; }};class object2{public: void get(){ cout << "object2"; } void out(){ cout << "out2"; }};template
class A{public : void func1() { object ob; ob.get(); } void func2() { object ob; ob.out(); }};int main(){ A
a; a.func1();//调用object1中的get函数 cout << endl; A
b; b.func2();//调用object2中的out函数}

由上面的代码能够看出template模板带给我们编程的优越性,它极大的提高了我们代码的利用率。

但是好性能背后往往都会有一些牺牲,比方在多重继承中的编译问题。

例如以下代码:

#include
using namespace std;class object1{public: void get(){ cout << "object1"; } void out(){ cout << "out1"; }};class object2{public: void get(){ cout << "object2"; } void out(){ cout << "out2"; }};class object3{public: void out(){ cout << "out3"; }};template
class A{public : void func1() { object ob; ob.get(); } void func2() { object ob; ob.out(); }};template<> class A
{public: void func2() { object3 ob; ob.out(); }};template
class B:public A
{public: void func3() { func1(); }};

以上代码。依照作者的意思是编译不通过,由于无法确定是否模板类template base class中有funct1()函数,我用的是vs2014编辑器,并没有出现这样的问题。所以,不知道是不是微软开发大神完好了这个编译缺点。一句话,对于。vs2014来说该条款是无效的。欢迎大神指正。

至于。假设为什么无法编译,是由于有全特化模板的出现。如上对object3的全特化过程中并没有funct1()函数,这时假设编译器不进行阻止,在程序以后执行中就会崩溃。

按作者的意思,假设出现以上问题,能够通过以下三种手段解决,三种方式的用意就是告诉编译器。基类中拥有派生类所需的函数。

让编译器进入基类进行寻找。而不是在没有寻找的前提下就编译报错。

第一种:

template 
class B:public A
{public: void func3() { this->func1();//加上this关键字 }};

另外一种:

template 
class B:public A
{ using A::func1;public: void func3() { this->func1();//加上this关键字 }};

第三种:

template 
class B:public A
{public: void func3() { A::func1(); }};

至于第三种,会关闭virtual绑定行为,慎用。

转载地址:http://pyvrl.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
利用makefile构建c++项目的思路介绍
查看>>
ssh的反向隧道
查看>>
F5 DDoS防御小妙招:减轻DDoS***危害的六大最佳方法
查看>>
echo
查看>>
MariaDB,MySQL中存储过程的学习笔记
查看>>
一张图诠释linux系统启动过程
查看>>
载入jQuery库的最佳方法
查看>>
系统错误提示修复Repair Filesystem
查看>>
【DAY20】Socket编程的补充2
查看>>
Openstack 网络服务Neutron [五]
查看>>
如何看硬盘SMART参数----用HDtune工具查看
查看>>
PUTTY使用Ctrl+s僵死的问题
查看>>
验证码识别技术研究
查看>>
WSDL文件生成java类
查看>>
我的友情链接
查看>>
CentOS7配置本地镜像及安装gluster服务
查看>>
android手势创建及识别
查看>>
弹了个框。。。不过不太好。 待解决
查看>>
keras 保存训练的最佳模型
查看>>