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
学习处理模板化基类里的名称 本节作者编写的意图在我看来能够总结成一句话,就是"怎样定义并使用关于模板类的派生过程,怎样处理派生过程出现的编译不通过问题". 以下我们看一段说明性的代 ...
随机推荐
- 基于特征码文件恢复工具magicrescue
基于特征码文件恢复工具magicrescue 常见类型的文件都包含一些特殊的字节,用来标识文件的类型.这些字节被称为特征码.在磁盘中,当记录文件存储位置的簇损坏后,就可以基于这些特征码来恢复文件. ...
- python opencv3 向图像里写字
git:https://github.com/linyi0604/Computer-Vision # coding:utf-8 import cv2 img = cv2.imread(".. ...
- bzoj 3931 最短路+最大流
较水,但因为范围问题WA了两次.... /************************************************************** Problem: 3931 Us ...
- js的继承实现方式
1. 使用call或者apply来实现js对象继承 function Animal(age){ this.age = age; this.say = function(){ console.log(' ...
- wikioi 1014 装箱问题(背包)
题目描述 Description 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数). 要求n个物品中,任取若 ...
- ROS知识(18)----Pluginlib原理
目录 Overview Example Providing a Plugin Registering/Exporting a Plugin The Plugin Description File Re ...
- 封装libsvm成可程序调用的C/C++类
libsvm很早之前就用了,现在封装一下方便自己使用,也方便大家更快的使用这个库,这个库一个挺有用的特性就是对测试样本的概率估计.源码在随笔的最后.liblinear的版本也是类似移植,主要是处理好数 ...
- C++反汇编-结构体和类
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 对象的内存布局 一般计算公式: 对象内存大小 = sizeof(数据成员1)+ sizeof(数据成员2) +. ...
- 重温PHP之冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走 ...
- 1588: [HNOI2002]营业额统计 (splay tree)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 5783 Solved: 1859[Submit][Stat ...