Effective C++ Item 43 学习处理模板化基类内的名称
本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:可在derived class templates 内通过 "this->" 指涉 base class templates 内的成员名称,或藉由一个明确写出的 "base class 资格修饰符"完毕。
演示样例:
class CompanyA{
public:
//...
void sendCleartext(const std::string &msg);
void sendEncrypted(const std::string &msg);
//...
};
class CompanyB{
public:
//...
void sendCleartext(const std::string &msg);
void sendEncrypted(const std::string &msg);
//...
};
class CompanyZ{ //这个 class 不提供 sendCleartext 函数
public:
//...
void sendEncrypted(const std::string &msg);
//...
};
class MsgInfo {...};
template<typename Company>
class MsgSender{
public:
//...
void sendClear(const MsgInfo &info){
std::string msg;
Company c;
c.sendCleartext(msg);
}
void sendSecret(const MsgInfo &info){
//...
}
};
template<> //一个全特化的 MsgSender;它和一般 template 同样。区别仅仅在于它删掉了 sendClear
class MsgSender<CompanyZ>{
public:
//...
void sendSecret(const MsgInfo &info){...}
};
template<typename Company>
class LoggingMsgSender: public MsgSender<Company>{
//...
void sendClearMsg(const MsgInfo &info){
将”传送前“的信息写到 log
sendClear(info); //调用 base class 函数,这段码无法通过编译。由于全特化的版本号里没有 sendClear 这个函数
将”传阅后”的信息写到 log
}
//...
};
解析:C++知道 base class templates 有可能被特化。而那个特化版本号可能不提供和一般性 template 同样的接口,
因此它往往拒绝在 templatized base classes内寻找继承而来的名称
纠正1:在 base class 函数调用动作之前加上 this->
template<typename Company>
class LoggingMsgSender: public MsgSender<Company>{
//...
void sendClearMsg(const MsgInfo &info){
将”传送前“的信息写到 log
this->sendClear(info); //
将”传阅后”的信息写到 log
}
//...
};
纠正2:使用 using 声明式
template<typename Company>
class LoggingMsgSender: public MsgSender<Company>{
//...
using MsgSender<Company>::sendClear;
void sendClearMsg(const MsgInfo &info){
将”传送前“的信息写到 log
sendClear(info); //
将”传阅后”的信息写到 log
}
//...
};
纠正3:指出被调用的函数位于 base class 内
template<typename Company>
class LoggingMsgSender: public MsgSender<Company>{
//...
void sendClearMsg(const MsgInfo &info){
将”传送前“的信息写到 log
MsgSender<Company>::sendClear(info); //不太好。关闭了 "virtual 绑定行为"
将”传阅后”的信息写到 log
}
//...
};
解析:上面的每一解法做的事情都同样:对编译器承诺"base class template"的不论什么特化版本号都将支持其一般版本号所提供的接口。
但假设这个承诺未能被实践出来,编译器还是会报错的。
演示样例:
LoggingMsgSender<CompanyZ> zMsgSender;
MsgInfo msgData;
zMsgSender.sendClearMsg(msgData); //error
Effective C++ Item 43 学习处理模板化基类内的名称的更多相关文章
- Effective C++ -----条款43:学习处理模板化基类内的名称
可在derived class templates内通过“this->“指涉base class templates内的成员名称,或藉由一个明白写出的”base class资格修饰符”完成.
- [EffectiveC++]item43:学习处理模板化基类内的名称
- 读书笔记_Effective_C++_条款四十三:学习处理模板化基类的名称
背景是这样的,有两个不同的公司,然后想设计一个MessageSender,为这两个公司发送不同的消息,既支持明文发送SendClearText,也支持密文发送SendEncryptedText.一种思 ...
- 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字
1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...
- 读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来
1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定 ...
- effective c++(07)之为多态基类声明virtual析构函数
class TimeKeeper { public: TimeKeeper() ; ~TimeKepper() ; ... } ; class AtomicClock:public TimeKeepe ...
- Java中的io流学习(了解四大基类和基本步骤)
Java中io流四大基类及io流操作四大基本步骤 io流:(input/output)即输入输出流.面向对象的思想之一是面向接口编程,面向父类编程,也就是多态.所以学好基类(父类)很重要. 分类 按处 ...
- 《effective C++》:条款07——为多态基类声明virtual析构函数
在继承中,基类的析构函数需要定义为虚析构函数数否则: (1)当派生类对象经由一个base类指针删除时,而这个base类的析构函数不是虚函数时,其结果是未定义的. (2)这样做会导致derived类部分 ...
- Effective C++ 条款43
学习处理模板化基类里的名称 本节作者编写的意图在我看来能够总结成一句话,就是"怎样定义并使用关于模板类的派生过程,怎样处理派生过程出现的编译不通过问题". 以下我们看一段说明性的代 ...
随机推荐
- leetcode 奇偶链表 python
要求空间复杂度O(1) 那就只能用指针不断改链表的指针, 不能建立新的内存 时间复杂度O(1) 一遍遍历 不能嵌套循环 我的思想是: 1 如果链表元素数量小于等于2个,那就无法操作 2 能操作的情况下 ...
- Django扩展
一.文件上传 当Django在处理文件上传的时候,文件数据被保存在request.FILES FILES中的每个键为<input type="file" name=" ...
- python 中__name__ = '__main__' 的作用,到底干嘛的?
python 中__name__ = 'main' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and execu ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- Windows下C语言调用dll动态链接库
dll是windows下的动态链接库文件,下面记录一下在windows下如何调用C语言开发的dll动态链接库. 1.dll动态链接库的源代码 hello_dll.c #include "st ...
- Poj 题目分类
初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. ...
- MYSQL-5.5.37-win32.msi 这个版本得程序包谁有吗 可以给我一下吗?
之前下载了这个版本得mysql 但是跟服务器链接不上 后来我就卸载了 但由于卸载不干净 现在又删了注册表 好像把这个程序包得什么文件删除了 现在提示配置文件错误 所以有这个程序包得 ...
- hdu3790最短路径问题(BFS+优先队列)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- 如何从Windows远程上传文件到Linux(例如CentOS 7)
一.先看Linux系统是否安装有vsftp软件(vs是very secure的意思) [root@localhost /]# rpm -qa | grep vsftpdvsftpd-3.0.2-9.e ...
- 在Linux下使用sprintf代替atoi实现整型转化为char*
程序中需要用到将整型转化为char*类型,然后将两个char*类型的变量拼接.将整型转化为char*自然想到了itoa函数: 头文件:#include <stdio.h> char *it ...