名字查找在编译时发生

    对象、引用或指针的静态类型决定了对象能够完成的行为。

要获得动态绑定,必须通过基类的引用或指针调用虚成员。当我们这样做时

编译器将在基类中查找函数。假定找到了名字,编译器就检查是参数是否与形参匹配。

    现在可以理解虚函数为什么必须在基类和派生类中拥有同一原型了。

如果基类成员与派生类成员接收的实参不同,就没办法通过基类类型的引用或者指针调用派生类的函数

考虑如下

    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 )的定义屏蔽了。

通过基类调用被屏蔽的虚函数

    通过基类类型的指针或引用调用函数时,编译器将在基类中查找该函数而忽略派生类

猜你喜欢

转载自blog.csdn.net/weixin_38756546/article/details/80971540