通过基类调用被屏蔽的虚函数 以及 虚函数与默认实参 的问题

今天看到一道题目:
#include <iostream>
using namespace std;
 
class A
{
public:
virtual void foo(int number=10)
{
cout<<number<<endl;
}
};
 
class B:public A
{
public:
virtual void foo(int number=20)
{
cout<<number<<endl;
}
};
 
 
int main()
{
B b;
A *a=&b;
a->foo();
return 0;
}
问最后输出结果是多少?
 
按照C++ Primer中关于通过积累调用被屏蔽的虚函数的讲解(C++ Primer P501)中,此处虽然a是A的指针,但是其基本对象是B类的,所以在调用foo函数时,会调用B的foo函数。
 
那么这道题的答案是20嘛?
 
答案是: 10
 
原因为:虽然最终调用的是B的foo函数,但是考虑一下虚函数与默认实参的关系(C++ Primer P482),当通过基类的引用或指针调用虚函数时,默认实参为基类虚函数中指定的默认实参,如果通过派生类的引用或者指针调用时,默认实参为派生类版本中指定的值。对于本例来说,a是由派生类获得的基类指针,那么调用的函数应该是在派生类中foo函数,但是参数确实基类中的默认值。所以例子的输出为10.

posted on 2014-02-20 12:10  楠哥1991  阅读(296)  评论(0编辑  收藏  举报

导航