2012-12-27 80 views
12

比方说,我有以下类别:从调用基类的重载方法

class A { 
public: 
    virtual void foo() { 
    bar(); 
    } 

protected: 
    virtual void bar() { 
    // Do stuff 
    } 
} 

class B : public A { 
protected: 
    virtual void bar() { 
    // Do other stuff 
    } 
} 

如果我有B的实例,并调用foo的方法,这条方法将被调用?这个编译器是特定的吗?

感谢

回答

15

A::foo将调用B::bar如果你有B一个实例。如果通过指针或对基类的引用来引用实例,则无关紧要:无论如何,调用B的版本;这是什么使多态性调用成为可能。该行为不是特定于编译器的:根据标准,虚拟函数的行为方式如此。

+7

请注意,在基础构造函数和析构函数中不是这种情况。在那里它会调用基础实现。讨论:http://www.cplusplus.com/forum/general/109477/ –