绝不重新定义继承而来的non-virtual函数
非虚函数实行静态绑定,如果派生类重新定义了非虚函数,将会覆盖基类的版本
这样当基类的指针指向派生类对象时,调用的就是基类的版本,因为是静态绑定,所以调用哪个版本取决于指针的静态类型
class B {
public:
    void mf() {
        cout << "B::mf" << endl;
    }
};
class D : public B {
public:
    void mf() {
        cout << "D::mf" << endl;
    }
};
int main() {
    D x;
    B *pb = &x;
    D *pd = &x;
    pb->mf();   // B::mf 静态绑定,调用基类版本
    pd->mf();   // D::mf
    return 0;
}
也表明基类的析构函数必须声明为虚函数,否则用基类指针指向派生类对象,delete基类指针时执行静态绑定,只会调用基类的析构函数,不会调用派生类的析构函数
class B {
public:
    void mf() {
        cout << "B::mf" << endl;
    }
    ~B() {
        cout << "~B" << endl;
    }
};
class D : public B {
public:
    void mf() {
        cout << "D::mf" << endl;
    }
    ~D() {
        cout << "~D" << endl;
    }
};
int main() {
    B *pb = new D;
    pb->mf();   // B::mf
    delete pb;  // ~B
    return 0;
}