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
学习处理模板化基类里的名称 本节作者编写的意图在我看来能够总结成一句话,就是"怎样定义并使用关于模板类的派生过程,怎样处理派生过程出现的编译不通过问题". 以下我们看一段说明性的代 ...
随机推荐
- mongodb的yum源配置和安装
安装前注意: 此教程是通过yum安装的.仅限64位centos系统 安装步骤: 1.创建仓库文件: vi /etc/yum.repos.d/mongodb-org-3.4.repo 然后复制下面配置, ...
- sql find duplicate
SELECT GUID, COUNT(*) FROM xx GROUP BY GUID HAVING COUNT(*) > 1; SELECT name, email, COUNT(*) FRO ...
- 解释一下什么是servlet?
Servlet是一种独立于平台和协议的服务器端的Java技术,可以用来生成动态的Web页面.与传统的CGI(计算机图形接口)和许多其他类似CGI技术相比,Servlet具有更好的可移植性.更强大的功能 ...
- Ubuntu 16.04 64位 tftp服务器搭建
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...
- 解决请求参数的中文乱码问题(get、post)
2018-11-28 在web请求与响应中,会遇到乱码问题,比如填写表单数据时,难免会输入中文,姓名.公司名称等.由于HTML设置了浏览器在传递请求参数时,采用的编码方式是UTF-8,但在解码时采用的 ...
- Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学
C. Zero-One 题目连接: http://codeforces.com/contest/135/problem/C Description Little Petya very much lik ...
- Codeforces Round #288 (Div. 2) B. Anton and currency you all know 贪心
B. Anton and currency you all know time limit per test 0.5 seconds memory limit per test 256 megabyt ...
- vue中路由返回上一个页面,恢复到上一个页面的滚动位置
第一步:路由文件的配置(对你所需要的vue文件进行保存缓存标志的添加) import Vue from 'vue' import Router from 'vue-router' import Hel ...
- Overview of MySQL Programs
http://blog.163.com/digoal@126/blog/static/16387704020110198756512/
- Jquery ajax传递复杂参数给WebService
参考: http://www.cnblogs.com/kingge/archive/2011/08/04/2127642.html http://www.cnblogs.com/micromouse/ ...