Effective C++学习---06.继承与面向对象设计

条款32:确定你的public继承塑模出is-a关系

  • is-a表示适用于父类身上的每一件事一定也适用于子类身上,因为每一个子类对象也都是父类对象

条款33:避免遮掩继承而来的名称

  • 符号名称在不同作用域中可能被遮掩,C++的名称遮掩规则(name-hiding rules)
class Base
{
public:
    void fun1();
};

class Derived : public Base
{
public:
    void fun1(int);
    void somefun()
    {
        fun1();//调用Base::fun1无法编译通过
               //因为Derived::fun1把Base::fun1遮掩了
    }
};
  • 为了让被遮掩的名称可用,可以使用using声明式或转交函数
class Base
{
public:
    void fun1();
    void fun2();
};

class Derived : public Base
{
public:
    using Base::fun1;//令Base::fun1在Derived作用域中可见
    void fun1(int);
    void fun2()
    {
        Base::fun2();//虽然Base::fun2在Derived作用域中仍不可见
                     //但是使用Derived::fun2转发Base::fun2
    }
};

条款34:区分接口继承和实现继承

  • 接口继承指在public继承之下,子类问题继承父类的所有接口
  • 纯虚函数只提供接口继承(子类必须提供纯虚函数的实现)
  • 非虚函数提供接口继承和强制性实现继承(不变性,意味着不允许修改实现)
  • 非纯虚函数提供接口继承和缺省实现继承(子类可以对非纯虚函数重写)

条款35:考虑virtual函数以外的其他选择

  • 使用NVI(non-virtual interface)手法:用public的非虚成员函数包裹较低访问性(private或protected)的虚函数
  • 用函数指针成员变量或std::function成员变量替换虚函数(修改函数指针或std::function即可修改调用的函数)
  • 将继承体系1的虚函数替换为另一个继承体系2的虚函数(在继承体系1中,将虚函数修改为指针,指向继承体系2,这样通过继承体系2的指针可以调用继承体系2的虚函数)

条款36:绝不重新定义继承而来的non-virtual函数

条款37:绝不重新定义继承而来的缺省参数值

  • 静态绑定:在编译期确定
  • 动态绑定:在运行期确定
  • 对于继承而言,非虚函数不允许重新定义,因此本条款主要描述的是虚函数,对于虚函数而言,其是动态绑定的,而缺省参数值是静态绑定的。也就导致如果通过父类的指针或引用调用虚函数,实际调用的是子类的虚函数,但是参数值却是父类的缺省值而不是子类的缺省值

条款38:通过复合塑模出has-a或“根据某物实现出”(is-implemented-in-terms-of)

  • 在应用域(application domain,在程序中利用类塑造现实世界中的某些事物,如人、汽车、视频画面等),复合意味着has-a
  • 在实现域(implementation domain,应用域之外的其他对象,软件中应用的某些资源的实现方法,如互斥锁、缓冲区、查找树等---底层均由某种机制实现),复合意味着is-implemented-in-terms-of

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

  • private继承意味着“根据某物实现出”(implemented-in-terms-of),但如果可以通过复合实现时,优先使用复合。当子类需要访问基类的protected成员时或需要重新定义基类的虚函数时,private继承比复合要好
  • 空白基类优化(empty base optimization):当父类是空白类(不带任何数据的类,没有任何非静态成员以及虚函数或虚基类)时,采用private继承的方法,不会占用额外的内存,如果采用复合的方法,编译器会为其分配额外的内存(一个空白基类sizeof==1)

条款40:明智而审慎地使用多重继承

  • 多重继承比单一继承复杂,可能会导致歧义性(符号的歧义性)
  • 虚继承会导致空间和时间成本。虚基类最好不带任何数据

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值