码迷,mamicode.com
首页 > 编程语言 > 详细

《Effective C++》继承与面对对象设计:条款32-条款40

时间:2019-01-02 17:22:48      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:缺省   base   effect   virtual函数   namespace   错误   private   mes   避免   

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

  • public继承意味着is-a。适用于base class身上的每一个函数也一定适用于derived class。

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

几层作用域:

  • global作用域
    • namespace作用域
      • Base class作用域
        • Drive class作用域
          • 成员函数
            • 控制块作用域

当前作用域会遮掩上一层作用域的名称(重载的函数也会直接遮掩)

class Base{
public:
    void f1();
}

class Drive : public Base {
public:
    void f1(int);  //会遮掩f1(),子类并没有继承f1()
}

Drive d;
d.f1();  //错误
d.f1(3); //正确

可以通过using声明式(public继承)或者inline转交(public和private继承)解决这一问题

class Base{
public:
    void f1();
}

//using 声明式
class Drive:public Base {
public:
    using Base::f1;
    void f1(int);
}

//inline转交
class Drive : private Base {
public:
    void f1(){
        Base::f1();
    }
    void f1(int);
}

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

  • 纯虚函数(只提供接口)
    • 纯虚函数造成了抽象类,抽象类不可以构造实体(对象)
    • Drived class中必须给出纯虚函数的实现
    • 纯虚函数可以给出实现(类外)
  • 虚函数(提供接口和缺省实现)
    • 用于实现多态
  • 非虚函数(提供了强制实现)
    • 可以看成此类独有,且最好不要在Drived class重新定义非虚函数

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

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

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

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

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

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

《Effective C++》继承与面对对象设计:条款32-条款40

标签:缺省   base   effect   virtual函数   namespace   错误   private   mes   避免   

原文地址:https://www.cnblogs.com/narjaja/p/10209196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!