Effective C++ 条款43
学习处理模板化基类里的名称
本节作者编写的意图在我看来能够总结成一句话,就是“怎样定义并使用关于模板类的派生过程,怎样处理派生过程出现的编译不通过问题”。
以下我们看一段说明性的代码:
#include<iostream>
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 <typename object>
class A
{
public :
void func1()
{
object ob;
ob.get();
}
void func2()
{
object ob;
ob.out();
}
};
int main()
{
A<object1>a;
a.func1();//调用object1中的get函数
cout << endl;
A<object2>b;
b.func2();//调用object2中的out函数
}
由上面的代码能够看出template模板带给我们编程的优越性,它极大的提高了我们代码的利用率。
但是好性能背后往往都会有一些牺牲,比方在多重继承中的编译问题。
例如以下代码:
#include<iostream>
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 <typename object>
class A
{
public :
void func1()
{
object ob;
ob.get();
}
void func2()
{
object ob;
ob.out();
}
};
template<>
class A<object3>
{
public:
void func2()
{
object3 ob;
ob.out();
}
};
template <typename object>
class B:public A<object>
{
public:
void func3()
{
func1();
}
};
以上代码。依照作者的意思是编译不通过,由于无法确定是否模板类template base class中有funct1()函数,我用的是vs2014编辑器,并没有出现这样的问题。所以,不知道是不是微软开发大神完好了这个编译缺点。一句话,对于。vs2014来说该条款是无效的。欢迎大神指正。
至于。假设为什么无法编译,是由于有全特化模板的出现。如上对object3的全特化过程中并没有funct1()函数,这时假设编译器不进行阻止,在程序以后执行中就会崩溃。
按作者的意思,假设出现以上问题,能够通过以下三种手段解决,三种方式的用意就是告诉编译器。基类中拥有派生类所需的函数。
让编译器进入基类进行寻找。而不是在没有寻找的前提下就编译报错。
第一种:
template <typename object>
class B:public A<object>
{
public:
void func3()
{
this->func1();//加上this关键字
}
};
另外一种:
template <typename object>
class B:public A<object>
{
using A<object>::func1;
public:
void func3()
{
this->func1();//加上this关键字
}
};
第三种:
template <typename object>
class B:public A<object>
{
public:
void func3()
{
A<object>::func1();
}
};
至于第三种,会关闭virtual绑定行为,慎用。
Effective C++ 条款43的更多相关文章
- Effective C++ -----条款43:学习处理模板化基类内的名称
可在derived class templates内通过“this->“指涉base class templates内的成员名称,或藉由一个明白写出的”base class资格修饰符”完成.
- [More Effective C++]条款22有关返回值优化的验证结果
(这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...
- More Effective C++ 条款0,1
More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...
- Effective C++ 条款08:别让异常逃离析构函数
1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...
- Effective C++ -----条款28:避免返回handles指向对象内部成分
避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ...
- Effective C++ -----条款21:必须返回对象时,别妄想返回其reference
绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...
- Effective C++ -----条款19:设计class犹如设计type
Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...
- Effective C++ -----条款18:让接口容易被正确使用,不易被误用
好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...
- Effective C++:条款27——条款
条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!
随机推荐
- 前端之CSS介绍
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS的语法 CSS语 ...
- memset函数的用法
重点需要注意一个细节:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充. 因此:如果int array[10]: memset(array, 1, 10):然后再把array ...
- Xwiki平台Windows搭建(Tomcat7 + XWiki6.2 + MySQL5.5)
背景介绍 国内xwiki安装使用资料较少,根据自己使用xwiki经验,总结出来,供参考,同时希望感兴趣的朋友能够一起讨论,XWiki是一个强大的Java开源的Wiki引擎. 它支持一些受欢迎的特性如: ...
- Units are seconds since 1970.
在Android实际开发过程中常常会碰到以秒为单位的日期.这时能够依据须要将他们进行格式化处理,详细过程例如以下: long seconds=Long.parseLong("14058896 ...
- android音乐播放器开发 SweetMusicPlayer 载入歌曲列表
上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...
- VC双缓冲画图技术介绍
双缓冲画图,它是一种主要的图形图像画图技术.首先,它在内存中创建一个与屏幕画图区域一致的对象,然后将图形绘制到内存中的这个对象上,最后把这个对象上的图形数据一次性地拷贝并显示到屏幕上. 这样的技术能够 ...
- 外连接OUTER JOIN(三十五)
外连接OUTER JOIN LEFT [OUTER] JOIN,左外连接 显示左表的全部记录及右表符合连接条件的记录 下面我们来演示一下,操作命令及部分结果如下: SELECT goods_id, ...
- SQL Server 2008 R2 超详细安装图文教程及问题解决(锐姿公司安装)
问题点: 1.为了sqlserver与mysql 的安全,建议数据库低权限运行.禁止远程访问 1433与 3306端口等. 2.安装提示.net 3.5没有安装 ,在server2012的添加 3. ...
- 如何利用Python网络爬虫抓取微信好友数量以及微信好友的男女比例
前几天给大家分享了利用Python网络爬虫抓取微信朋友圈的动态(上)和利用Python网络爬虫爬取微信朋友圈动态——附代码(下),并且对抓取到的数据进行了Python词云和wordart可视化,感兴趣 ...
- selenium与phantomjs简单结合
selenium工具安装 Windows安装pip install selenium Linux安装apt-get install selenium 查看selenium支持的浏览器from sele ...