对象、引用或指针的静态类型决定了对象能够完成的行为。
要获得动态绑定,必须通过基类的引用或指针调用虚成员。当我们这样做时
编译器将在基类中查找函数。假定找到了名字,编译器就检查是参数是否与形参匹配。
现在可以理解虚函数为什么必须在基类和派生类中拥有同一原型了。
如果基类成员与派生类成员接收的实参不同,就没办法通过基类类型的引用或者指针调用派生类的函数
考虑如下
class D1: public Base{
public:
//hides fcn in the base; this fcn is not virtual
int fcn( int );//parameter list differs from in Base
//D1 inherits definition of Base::fcn()
};
class D2 : public D1{
public:
int fcn( int );//nonvirtual function hides D1:fcn( int)
int fcn(); //redefines virtual fcn from Base;
};
从Base继承的虚函数不能通过D1对象调用,因为该函数被fcn( int )的定义屏蔽了。
通过基类调用被屏蔽的虚函数
通过基类类型的指针或引用调用函数时,编译器将在基类中查找该函数而忽略派生类