2014-01-22 44 views
0

很简单的C++继承的例子:C++继承与方法覆盖

#include <iostream> 
using namespace std; 

class A{ 
public : 
virtual void print(A a){ 
    cout<<"a"<<endl; 
} 
}; 
class B : public A { 
public : 
    virtual void print(A a){ 
    cout<<"a2"<<endl; 
} 
virtual void print(B b){ 
    cout<<"b"<<endl; 
} 
}; 

int main(){ 
B b; 
A &a = b; 
a.print(b); 
return 0; 
} 

为什么这个输出A2? 我本来预料到这个效果是一样的: b.print(b) 谢谢!

+0

它被称为“功能覆盖”。 – herohuyongtao

回答

2

因为您的参考号是A类型,因此在决定要调用的内容时将仅考虑A方法。由于print(A)是虚拟的,因此它实际上将调用B中与A的签名匹配的方法。

如果这是令人困惑的,请考虑您是否已将方法foo添加到B。如果您尝试拨打a.foo(),会发生什么情况?它会失败,因为A类型的对象没有foo方法。

+0

这是与java不同的方式。谢谢! – user3221925