1、如果子类实现了基类的函数,返回值、参数都相同,就覆盖了基类的函数。
2、使用作用域解析运算符来调用基类的函数。myDinner.Swim(); —— 调用子类的。myDinner.Fish::Swim(); —— 调用基类的(基类是Fish)
3、在子类中使用关键字using解除对Fish::Swim()的隐藏。
public:using Fish::Swim; // unhide all Swim() methods in class Fish
4、父类优于子类对象之前被实例化。成员变量优于构造函数之前被实例化。
递归到父类,每个类先实例化成员,再调用构造。但是一定是先找到父类,再进行上述过程。
5、私有继承:base类的public、protected,只能被Derived类使用,而无法通过Derived实例来使用。私有继承是:has a,不再是is a。(考虑将继承关系变成组合)
保护继承:也是has a。Derived类可以访问基类的public、protected。继承层次结构外,也不能通过子类实例访问基类的成员。限制在类内实现而不是授权给实例。在继承层次结构中,子类的子类能访问Base类的public、protected。
无论什么继承,子类都不能访问父类的私有成员。
6、避免切除问题(类的截断),不要按值传递参数,以指向基类的指针或者const引用的方式
void UseBase(Base input);
...
Derived obj;
UseBase(obj); // 产生截断
7、多重继承,不同类之间用“,”隔开
class Platypus: public Mammal, public Bird, public Reptile {...
};
8、final —— 不能用做基类,禁止被继承。
class CannotBeBass final {...
};
class Platypus final: public Mammal, public Bird, public Reptile {...
};
作用于成员函数,禁止多态。
9、提问:通过使用using语句,子类能不能访问父类的private?
—— 《21天学通C++》