《Effective C++》条款39

明确而审慎地使用private继承

当你想重写A内的虚函数而A和B并不构成is-a的关系时,public继承并不是一个好方法。所以这个时候需要private继承。因为你其实想做的是代码的复用。(通过在子类调用父类函数)

class A
{
public:
	virtual void test()
	{
		cout << "A" << endl;
	}
	...
};
class B :private A
{
private:
	virtual void test();
	...
};

这个设计不是最佳:

class A
{
private:
	class AB :public B
	{
	public:
		virtual void test();
		...
	};
	AB ab;
	...
};

这样写的好处是:

1.避免了A的子类重写test(),(你不想让子类重写这个函数)。写成内部类的形式,可以保证A的子类不可能重写test()函数,因为AB类是私有。

2.如果你想将A的编译依存性降至最低。如果A继承B,当A被编译时B的定义必须可见,所以定义A的那个文件必须#include"B.h" , 但是如果AB移出A之外而A内含指针指向一个AB,A可以只带着一个简单的AB声明式,不再需要#include任何与B有关的东西。

独立(非附属)的类的大小不是0:

《Effective C++》条款39_第1张图片

通常C++官方会默默安插一个char到空对象内。然而内存对齐之后可能与一个int的大小相差还不算很小。

当以继承的方式时:

《Effective C++》条款39_第2张图片

节省了空间!

当然空类也不是指什么都没有的类,他可能是这种:

​​​​​​​class Empty
{
    void test();
    static int x;
    ...
};

总结:

1.private继承一般用于复用的场景,当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,很合理。

2.针对empty class可以进行优化。

 

你可能感兴趣的:(Effective,C++,c++)