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

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

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

#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的更多相关文章

  1. Effective C++ -----条款43:学习处理模板化基类内的名称

    可在derived class templates内通过“this->“指涉base class templates内的成员名称,或藉由一个明白写出的”base class资格修饰符”完成.

  2. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  3. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

  4. Effective C++ 条款08:别让异常逃离析构函数

    1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...

  5. Effective C++ -----条款28:避免返回handles指向对象内部成分

    避免返回handles(包括reference.指针.迭代器)指向对象内部.遵守这个条款可增加封装性,帮助const成员函数的行为像个const,并将发生“虚吊号码牌”(dangling handle ...

  6. Effective C++ -----条款21:必须返回对象时,别妄想返回其reference

    绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个loc ...

  7. Effective C++ -----条款19:设计class犹如设计type

    Class的设计就是type的设计.在定义一个新type之前,请确定你已经考虑过本条款覆盖的所有讨论主题. 新type的对象应该如何被创建和销毁? 对象的初始化和对象的赋值该有什么样的区别? 新typ ...

  8. Effective C++ -----条款18:让接口容易被正确使用,不易被误用

    好的接口很容易被正确使用,不容易被误用.你应该在你IDE所有接口中努力达成这些性质. “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容. “阻止误用"的办法包括建立新类型.限 ...

  9. Effective C++:条款27——条款

    条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!

随机推荐

  1. luoguP1462通往奥格瑞玛的道路(二分答案+spfa)

    题意 给出n个点m条边的无向图. 每条边有两个权值a,b; 问在保证从1到n的路径a权值和小于x时,路径上b权值最大值最小为多少. (n≤10000,m≤50000,x≤1000000000) 题解 ...

  2. Vector源码学习

    安全的可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则有两种,1.增加扩容补偿的长度,2.按照现有数组长度翻一倍.容量上限是Integer.MA ...

  3. 入门python:《Python编程从入门到实践》中文PDF+英文PDF+代码学习

    入门python推荐学习久负盛名的python入门书籍<Python编程从入门到实践>. 书中涵盖的内容是比较精简的,没有艰深晦涩的概念,最重要的是每个小结都附带有"动手试一试& ...

  4. write---向指定登录用户终端上发送信息

    write命令用于向指定登录用户终端上发送信息.通过write命令可传递信息给另一位登入系统的用户,当输入完毕后,键入EOF表示信息结束,write命令就会将信息传给对方.如果接收信息的用户不只登入本 ...

  5. python第三次作业——叶耀宗

    作业1 import random#引入随机数模块xing=["小白","小黄","小王","小陈","小绿& ...

  6. 紫书 习题 10-10 UVa 1645(递推)

    除了根节点以外,有n-1个节点,然后就看n-1的因数有那些,所有因数加起来(递推)就好了. #include<cstdio> #define REP(i, a, b) for(int i ...

  7. 用户向导左右滑动页面实现之ImageSwitcher

    当第一次打开一个app时,通常有一个使用向导介绍本APK的基本功能和用法,这个向导是很重要的,方便用户能高速知道和适应该app如何用. 实现此使用向导有非常多种方法,比方用ImageSwitcher, ...

  8. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  9. EBS TimeZone问题

    记录问题 :  http://blog.csdn.net/cymm_liu/article/details/29234919     --     Oracle 数据库中的 时间 时区 http:// ...

  10. thinkphp5项目--企业单车网站(四)

    thinkphp5项目--企业单车网站(四) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps:/ ...