多态公有继承:
1. 在派生类中重新定义基类的方法
2. 使用虚方法
如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或者指针的类型来选择方法版本。为基类声明一个虚析构函数也是一种惯例。
3. 非构造函数不能使用成员初始化列表的方法。
4. 派生类方法中调用基类同名方法,基类方法需要使用作用域解析符来限定。如果不是同名,则不必使用作用域解析符。
5. 公有继承模型下,基类指针既可以指向基类对象,也可以指向派生类对象。因此可以创建一个基类的指针数组,其中的指针既可以指向基类对象,又可以指向派生类对象,实现了多态。
6. 析构函数为虚的重要性:如果析构函数非虚,释放对象时调用指针类型的析构函数;如果析构函数为虚,则调用被指向对象类型的析构函数。
7. 静态联编和动态联编。编译过程中进行联编是静态联编,程序运行时能够正确选择选择代码的联编是动态联编,主要是虚函数的动态联编。编译器对非虚函数进行静态联编,对虚函数使用动态联编。静态联编的效率高,动态低。如果要在派生类中重新定义基类的方法,则将它设置为虚方法,否则设置为非虚。
8. 基类指针或引用可以直接指向派生类对象;派生类指针或引用不可以指向基类对象,必须采用显示转换。当函数的形参是基类对象,实参为派生类对象时,只将派生类对象中基类内容传递给基类对象。
9. 使用虚函数的成本:(1)每个对象都将增大,增大量为存储地址的空间;(2)对于每个类,编译器都将创建个虚函数地址表;(3)对于每个虚函数调用,都要执行一项额外的操作,即到表中查找地址。
10. 构造函数不能是虚函数;析构函数一般要写成虚函数;友元函数不能是虚函数,因为只有成员函数才能是虚函数。
11. 派生类重新定义继承的方法,应确保与基类中的方法原型相同,如果参数不同,并不会构成重载,反而会报错;但如果返回基类函数的返回类型为基类的引用或者指针,则派生类中的方法可修改为返回派生类的指针或引用,也可以不修改。如果基类方法在基类声明中被重载了,则在派生类中如果要重新定义这些函数时,应该对上述重载的函数都进行重新定义,否则没有被重新定义的重载函数会被屏蔽。