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

/***********示例
class Person{};
class Student : private Person{};
void eat(const Person& p);
void study(const Student& s);
Person p;
Student s;
eat(p); //没问题
eat(s); //错误
***************/


//规则一:private继承时,编译器不会自动将一个derived class对象转换为一个base class对象
//规则二:由private base class继承而来的成员,在derived class中都会变成private属性


//private继承意味着is-implemented-in-terms-of. 如果你让class D以private形式继承class B,
//你的用意是为了采用class B内已经备妥的某些特性,不是因为B对象与D对象存在有任何观念上的关系。
//private纯粹只是一种实现技术(这就是为什么继承自一个private base class的每样东西在你的class内都是private,因为它们都只是实现枝节而已)
//private继承意味着只有实现部分被继承,接口部分应略去。
//如果D以private形式继承B,意思是D对象根据B对象实现而得,再没有其它意义了
//Private继承在软件“设计”层面没有意义,其意义只及于软件“实现”层面。


//Private继承和复合一样都有is-implemented-in-terms-of的意义,如何取舍
//1、尽可能使用复合,必要时才使用private继承
//2、当protected成员或virtual函数牵扯进来时
//3、当空间方面的厉害关系足以踢翻private继承的支柱时


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


//Private继承意味着is-implemented-in-terms-of. 它通常比复合的级别低。但是当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的。
//和复合不同,private继承可以造成empty base最优化。这对致力于“对象尺寸最小化”的程序开发者而言可能很重要。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值