【Effective C++】继承与面向对象设计

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

  • 每一个derived对象也应该是base对象

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

复制代码
 1 class base
 2 {
 3 private:
 4     int x;
 5 
 6 public:
 7     virtual void mf1() = 0;
 8     virtual void mf1(int);
 9     virtual void mf2();
10     void mf3();
11     void mf3(double);
12 };
13 
14 class derived : public base
15 {
16 public:
17     virtual void mf1();
18     void mf3();
19     void mf4();
20 };
21 
22 derived d; //子类中的函数掩盖掉父类中的所有同名函数
23 int x;
24 d.mf1();  // ok
25 d.mf1(x); // error
26 d.mf2();  // ok
27 d.mf3();  // ok
28 d.mf3(x); // error
29 
30 class derived : public base
31 {
32 public:
33     using base::mf1;
34     using base::mf3;
35     virtual void mf1();
36     void mf3();
37     void mf4();
38 };
39 
40 derived d; //子类中的函数掩盖掉父类中的所有同名函数
41 int x;
42 d.mf1();  // ok   derived::mf1;
43 d.mf1(x); // ok   base::mf1;
44 
45 d.mf3();  // ok    derived::mf3;
46 d.mf3(x); // error base::mf3;
复制代码

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

  • pure virtual函数只具体指定接口继承
  • impure virtual函数指定继承接口同时给出缺省实现
  • non virtual函数制定接口继承以及强制性实现继承

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

  • 见原书

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

  • 如题目,non-virtual意味这继承关系中共性的部分不应该改变。

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

  • virtual函数是动态绑定而缺省参数是静态绑定
复制代码
 1 class base
 2 {
 3 private:
 4     int x;
 5 
 6 public:
 7     virtual void mf1(int P = 0);
 8 };
 9 
10 class derived : public base
11 {
12 public:
13     virtual void mf1(int P = 1);
14 };
15 
16 base *p = new derived; //实际上参数 P = 0;
复制代码

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

复制代码
 1 class class1
 2 {
 3 private:
 4     int x;
 5 
 6 public:
 7     virtual void mf1(int P = 0);
 8 };
 9 
10 class class2
11 {
12 public:
13     virtual void mf1(int P = 1);
14 
15 private:
16     class1 *c1; //复合/组合关系
17 };
复制代码

条款39:private继承

  • private继承也是has-a或者根据某物实现出的逻辑
  • 优先使用复合/组合

条款40:多重继承

  • 见原书
posted @   axingzheng  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示