原则96:不必为了多态行为而损害语法问题,例如双目运算符的对称隐式转换。
原则97:虚函数实现行为上的变化;数据成员实现值的变化。
定义47:
隐藏(hide):一个成员函数若与在一个基类或文件作用域中声明的某个函数同名,则隐藏了那个函数。
重载(overload):一个函数用定义在同一作用域的同样的名称重载了另一个函数的名称。
覆盖(override):一个成员函数覆盖了在一个基类中声明为虚拟的同样的函数。
重新定义(redefine):一个函数的默认定义被另一个定义不可挽回的取代。
指导方针13:避免将一个基类函数隐藏在一个派生类中。
一个派生自一个纯协议类的抽象类有时被称为部分实现。在一个部分实现中的一些函数可能有一个有用的默认行为,但是它们应该不必自动成为默认行为,而应该定义为纯虚函数,迫使一个派生类作者显式的激活默认行为。
#include struct Base { // *** Base Class *** virtual void f() = 0; virtual ~Base(); }; Base::~Base() {} struct Partial : Base { // *** Partial Implementation *** virtual void f() = 0; // declaration of pure virtual function ~Partial(); }; void Partial::f() { // definition of pure virtual function cout << " Partial::f" << endl; } Partial::~Partial() {} struct Derived : Partial { // *** Concrete Derived Class *** Derived() {} void f(); ~Derived(); }; void Derived::f() { cout << " Derived::f" << endl; Partial::f(); // explicit call of pure virtual function } Derived::~Derived() {} int main()
{
Base *b = new Derived;
b->f();
return 0;
} // Output: // Derived::f // Partial::f
原则98:静态成员函数通常用于实现一个单独工具类中的非基本功能。