今天看到一道题目:
#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.
通过基类调用被屏蔽的虚函数 以及 虚函数与默认实参 的问题
原文:http://www.cnblogs.com/zhoueh1991/p/3557363.html