Item:明智而审慎的使用pirvate继承

 使用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可以避免这种情况

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值