《Effective C++》条款39
2023-12-20 06:50:30
明确而审慎地使用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:
通常C++官方会默默安插一个char到空对象内。然而内存对齐之后可能与一个int的大小相差还不算很小。
当以继承的方式时:
节省了空间!
当然空类也不是指什么都没有的类,他可能是这种:
???????class Empty { ?? ?void test(); ?? ?static int x; ?? ?... };
总结:
1.private继承一般用于复用的场景,当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,很合理。
2.针对empty class可以进行优化。
?
文章来源:https://blog.csdn.net/qq_64863535/article/details/135097188
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!