绝不重新定义继承而来的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;
}