zoukankan      html  css  js  c++  java
  • Effective C++笔记(六):继承与面向对象设计

    参考:http://www.cnblogs.com/ronny/p/3756494.html

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

          “public继承”意味着is-a。适用于base classes身上的每一件事情一定也适合于derived class身上,因为每个derived classes对象也都是一个base classes对象。

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

         derived classes内的名称会遮掩base classes内的名称。  

    Derived d;
    int x;
    d.mf1();    //ok,调用Derived::mf1
    d.mf1(x);    //error,因为Derived::mf1遮掩Base=::mf1
    d.mf2();    //ok,调用Base::mf2
    d.mf3();    //ok,调用Derived::mf3
    d.mf3(x);    // error,因为Derived::mf3遮掩了Base::mf3

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

        接口继承和实现继承不同。在public继承之下,derived classes总是继承base class的接口。

        pure virtual函数只具体指定接口继承

       简朴的(非纯)impure virtual函数具体指定接口继承及缺省实现继承。

       non-virtual函数具体指定接口继承以及强制性实现继承

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

    。。。。。。。。

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

         当派生类中重新定义了基类中的non-virtual函数时,如果用指向基类类型的指针(实际指向派生类对象)来访问该non-virtual函数时,访问的是基类对象的non-virtual函数。

        造成上面行为的原因是,non-virtual是静态绑定的,区别于virtual函数的动态绑定。

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

     virtual函数系动态绑定的,而缺省参数值是静态绑定的。

    条款38:通过复合塑模出has-a或“根据某物实现出”

       复合或包含意味着has-a。如果我们想设计一个自己的set,我们思考后觉得可以用list来实现它,但是如果我把它设计出list的一个派生类,就会有问题,

    因为父类的所有行为在派生类都是被允许的,而list允许元素重复,而set则显然不行,所以set与list之间不符合is-a关系,我们可以把list设计为set的一个成员,即包含关系(has-a)。

     

     

  • 相关阅读:
    系统开发——页面跳转函数的书写
    PC 端自动化最佳方案
    access 点滴
    调用outlook发邮件
    mac安装vmware fusion后设置vmnet8上网
    Gin框架国内安装教程
    mac下一些vscode的初始化设置和使用
    Mac: 使用SDK切换gradle版本
    transfer.sh -- 使用 curl 从命令行上传文件并返回下载地址的文件分享服务(可自架服务端)
    使用ffmpeg转码,解决IDM从youtube下下来的视频在机顶盒上放不出声音问题(使用GPU加速)
  • 原文地址:https://www.cnblogs.com/573177885qq/p/5412567.html
Copyright © 2011-2022 走看看