条款32:确定你的public继承塑模出is-a关系
- public继承意味着is-a。适用于base class身上的每一个函数也一定适用于derived class。
条款33:避免遮掩继承而来的名称
几层作用域:
- global作用域
- namespace作用域
- Base class作用域
- Drive class作用域
- 成员函数
- 控制块作用域
- 成员函数
- Drive class作用域
- Base class作用域
- namespace作用域
当前作用域会遮掩上一层作用域的名称(重载的函数也会直接遮掩)
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:明智而审慎的使用多重继承
原文地址:https://www.cnblogs.com/narjaja/p/10209196.html
时间: 2024-10-10 16:28:03