使用private继承后,编译器不会将一个private继承的派生类转换为基类
class Base
{
}
class Derived:private Base
{
}
Base* pBasePointer = new Derived(); // 错误,Derived已经不是一个Base,不能转换为基类
private意味着根据某物实现, 意义主要是在实现层面,而没有设计层面的意义。 继承实现,不继承接口
具有和composite类似的功能,但perfer composite than private inherit。
class compute { public: int add(int num1, int num2); int plus(int num1, int num2); } // bookStatics 要使用compute的add和plus // 但bookStatics不是一个compute,用private继承实现如下
class bookStatics:private compute { public: bookStatics() { }; int statics() { add( book1, book2); }; privateL int book1; int book2; }
使用composite实现
class bookStatics { public: bookStatics( compute aCompute) : m_compute(aCompute) { }; int statics() { return compute->add( book1, book2); }; privateL int book1; int book2; compute* m_compute; }
什么时候需要考虑使用private继承:
1. 需要改写虚函数(或用composite,导入一个私有类去改写虚函数),或想访问基类的protected函数;
2. 某些极端情况考虑内存。空类(没有虚函数,没有non-static成员变量),大小为零之独立(非附属)对象,的size不为0,通常为1(由编译器决定),composite的话会多使用内存,但private继承则不会class Empty { }; class Hold { private: int x; Empty y; }
这时候
sizeof( Hold ) > sizeof(int)
因为面对大小为零的之独立非附属对象,通常C++编译器都会安插一个char到空对象中去,齐位可能导致不止1。对内存要求很严的时候,private可以避免这种情况