笔记: 条款39: 明智而审慎地使用private继承

这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。

如果类之间的继承关系是private,编译器不会自动将一个继承类对象转换为一个基类对象。

private继承意味着根据某物实现出,和复合的意义一样。

通过使用复合+public继承使得继承的类无法继承它并重新定义它的虚函数,模拟java中的final或c#中的sealed的阻止派生类重新定义虚函数的能力。如下:

class Timer {
public:
	explicit Timer(int freq);
	virtual void onTick()const;
};
class Widget { 
private:
	class WidgetTimer : public Timer {
	public:
		virtual void onTick()const;
	};
	WidgetTimer timer;
};
  • 空类:不使用non-static成员的类。
  • 如果空类作为父类,那么派生类的大小不需要算父类,private继承的好处之一
  • 相反如果使用复合,那么派生类的大小就要加上空类的大小。

 

当你面对”并不存在 is-a关系的两个类,其中一个需要访问另一个的protected成员,或需要重新定义其一或多个虚函数,private继承极有可能称为正统设计策略。

请记住

私有继承意味着根据某物实现出。它通常比复合的级别低。但是当继承类需要访问基类中的保护成员,或需要重新定义继承而来的虚函数时,这么设计是合理的。

和复合不同,私有继承可以造成空类最优化。这对致力于对象尺寸最小化的程序库开发者而言,可能很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值