Effective C++条款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);

其中eat(s)却会调用错误,如果类之间的继承关系是私有的,编译器不会自动将一个派生类对象转换为一个基类对象。这就是为什么通过s调用eat会失败的原因.其次,由私有继承而来的成员,在派生类中都会变成私有属性.
私有继承也能实现has-a关系和包含一样。那么应该使用哪种方式呢?
答案是:尽可能的使用包含,必要的时候才使用私有继承。因为包含易于理解,类声明中包含表示被包含类的显示命名对象,代码可以通过名称引用这些对象,而使用私有继承使关系更抽象。其次,继承会引起很多问题,尤其是从多个基类继承的时候。

假定有以下的情况:

class Empty(){};//没有数据
class HoldSAnInt
{
private:
	int x;
	Empty e;
}

你会发现sizeof(HoldSAnInt) > sizeof(int). 这似乎有点不符合常理,因为一个空成员变量竟然要求内存。在大多数编译器中sizeof(Empty)为1,因为面对大小为零的独立对象,C++通常会默默安插一个char到空对象内。此外还有内存对齐的要求,所以可能HoldsAnint这样的对象不只获得一个char大小.

如果你继承Empty,而不是使用包含:

class HoldSAnInt : private Empty
{
private:
	int x;
};

sizeof(HoldsAnInt) == sizeof(int).
这是所谓的(空白基类最优化).

总结:
1.private继承意味着has-a,它通常比包含的级别低,但是当派生类需要访问基类的保护对象时或需要重新定义继承而来的虚函数时,使用私有继承是合理的
2.和包含不同,私有继承可以造成empty base最优化。这对致力于对象尺寸最小化的程序库开发者而言,可能很重要

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值