effective C++条款三十九解析
来源:互联网 发布:nba2k16捏樱木花道数据 编辑:程序博客网 时间:2024/06/07 15:12
明智而谨慎的使用private继承
首先必须强调的一点是private继承不是Is-a关系,而是根据某物实现,而根据某物实现的最佳方式是复合(稍后我们会说private继承的用途)。
第一个使用private继承我们需要强调的一点是:编译器不会将一个private继承而来的对象转换成一个base类对象。我们首先来看一个例子:
class Person{}class Student:private Person{}void eat(Person&);Person p;Student s;eat(p);//正确eat(s);//错误,不会吧一个private继承的派生类对象转换成一个基类对象所以所private继承只是一种实现手法。并且表明的意义是根据某物实现,我们在实现的时候尽量使用复合的手段来解决根据某物实现的问题。有的时候我们可能需要private继承:
1.像访问基类对象的protected成员,注意如果是复合的方式我们是没法访问的(其实这个是否可以用友元来替代)
2.需要重新定义基类class的某一个virtual函数。这个时候我们使用private继承。(当然这个也有适当的处理方法)
我们先来看需要重新定义一个virtual 函数的情况。
比如我们有一个widgets类需要定时做一些统计工作,我们完全可以使用private继承。比如下面这个timer函数
class Timer{public:explicit Timer(int tickFrequency);virtual onTick() const;}
我们可能只像继承onTick()(当然这个函数里也没有其他virtual ,假设有其他的也不需要),这驱使我们实现出一下代码:
class widgets:private Timer{public:virtual onTick() const;}当然我们也有替代的方案(函数定义的嵌套)如下:
class widgets{private:class widgetTimer:public Timer{public:virtual void onTick() const;};widgetTimer timer;}
这种做法可以阻住派生类在重新定义虚函数onTick();
当然private继承一个特别的用处就是可以不暂居空间(对于基类只有函数但没有对象的情况),但是复合实现上至少还是占据了1个字节的空间。例如我们的uncopyable函数就是用private继承而来的。
最后强调一次,根据某物实现的最佳做法是复合并不是private继承,private继承的使用需要特别小心。阅读全文
0 0
- effective C++条款三十九解析
- Effective C++:条款01
- Effective C++:条款02
- Effective C++:条款03
- Effective C++:条款04
- Effective C++:条款05
- Effective C++:条款06
- Effective C++:条款07
- Effective C++:条款08
- 《effective C++》条款三
- 《effective C++》条款5
- 《effective C++》条款六
- Effective C++--经验条款
- Effective C ++ 条款34
- 《Effective C++》条款05
- 《Effective C++》条款06
- 《Effective C++》条款08
- effective c++条款三十七解析
- 类的继承和组合
- 'mysqld_safe' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- 操作 sd卡 error
- 执行sudo go get出现$GOPATH not set的问题
- VC 关于CEdit基本用法
- effective C++条款三十九解析
- c# delegate
- 枚举:生理周期
- Linux 安装jdk和配置环境变量
- Eclipse怎么在线安装JD-Eclipse反编译插件(JD插件Debug调试显示参数值)?
- SpringMVC通过ApplicationContext得到动态代理报错问题
- 源码安装libcurl后yum出错,pycurl.so: undefined symbol: CRYPTO_set_locking_callback
- 从RxJava1.x到2.0
- .net设计模式之观察者模式