条款32:确定你的public继承塑模出is-a关系
条款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:绝不重新定义继承而来的缺省参数值
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:多重继承
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?