首页 > 其他 > 详细

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

时间:2014-02-20 23:25:41      阅读:449      评论:0      收藏:0      [点我收藏+]
今天看到一道题目:
#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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!