Effective C++ 条款39

我从本条款中学到了以下内容:
1.private继承不同于另外两种继承,派生类对象不能隐式转换为基类对象。如下代码:

class Bird//鸟
{

};

class ostrich:private Bird//鸵鸟
{

};

int main()
{
Bird *b =  new ostrich();//编译不通过,基类不能转换为派生类

}

编译器明确指出基类是不可访问的,所以转换失败。private继承在基类和派生类之间已经没有所谓的继承关系,之所以有它的存在纯粹是为应用层面服务,即为了编程的灵活性而存在的继承关系。

2.如下代码,告诉我们private调用的好处,当存在一种特殊情况时,即base class 大小为空时,调用private继承可以使派生类占据的空间大小最小化。这时有人会说我定义的类不是空,为什么大小为1个字节,这里简单解释下。任何一个类的大小都不为空,即使你这样定义
class m{};这个类的大小依然为1,类的大小只和变量有关,并且变量是非静态变量,静态变量不影响类的大小。

#include<string>
#include<iostream>
using namespace std;
class Bird//鸟
{
public:
    static string name;
    static string getName(){ return name; }
};

class ostrich:private Bird//鸵鸟
{

};

int main()
{
    int m1 = sizeof(Bird);//m1大小为1个字节
    int m2 = sizeof(ostrich);//m2大小也为1个字节

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值