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继承的使用需要特别小心。



原创粉丝点击