【发布时间】:2017-08-06 14:37:41
【问题描述】:
我在一次采访中被问到这个问题。我无法在那里回答这个问题。我现在也无法得到它,至于为什么输出是这样的。 代码如下:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun ( int x = 0)
{
cout << "Base::fun(), x = " << x << endl;
}
};
class Derived : public Base
{
public:
virtual void fun ( float x = 10.0 )
{
cout << "Derived::fun(), x = " << x << endl;
}
};
int main()
{
Derived d1;
Base *bp = &d1;
bp->fun();
d1.fun();
d1.fun(1.2);
return 0;
}
以上代码的输出为:
Base::fun(), x = 0
Derived::fun(), x = 10
Derived::fun(), x = 1.2
问题是: 在第一种情况下,我们说 fun() 函数都被重载(并且没有被覆盖,因为它们的声明不同)并且基础 fun() 被调用,但是这些 fun() 声明不可能被重载(因为它们仅在声明是否包含默认参数时有所不同)
void fun(int x = 0)
void fun(float x = 10.0)
这些函数不可能重载。
上述两种情况似乎存在矛盾。
任何解释这种情况的相关文章/链接都会非常有帮助。
【问题讨论】:
-
您期望输出是什么以及为什么?
-
在第一种情况下,由于运行时多态性,输出应该是 Derived::fun(), x = 10.0。第二种和第三种情况,你如何决定输出?
标签: c++ inheritance overriding overloading