笔记: 条款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继承极有可能称为正统设计策略。

请记住

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

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

猜你喜欢

转载自blog.csdn.net/lkq_primer/article/details/81122726
今日推荐