此代码的输出为15
,我真的不知道为什么。我认为它在x=5
函数中使用了foo
,但我不知道为什么。任何人都可以帮助我吗?
#include <iostream>
#include <string>
using namespace std;
struct A
{
virtual int foo(int x = 5)
{
return x*2;
}
};
struct B : public A
{
int foo(int x = 10)
{
return x*3;
}
};
int main(int argc, char** argv)
{
A* a = new B;
cout << a->foo();
return 0;
}
答案 0 :(得分:6)
我认为它在
x=5
函数中使用foo
,但我不知道为什么。
是的,这里使用了基类A
声明的默认参数(即5
),因为你在静态类型为{{}的对象上调用foo()
1}}。 default arguments是根据静态类型决定的,而不是动态类型。
该标准对此有明确的解释,$8.3.6/10 Default arguments [dcl.fct.default]:
(强调我的)
虚函数调用([class.virtual])使用默认参数 在由静态确定的虚函数的声明中 表示对象的指针或引用的类型。压倒一切 派生类中的函数不从中获取默认参数 它覆盖的功能。 [例如:
A*
- 结束示例]
答案 1 :(得分:3)
此调用分为两部分:
x
的值 - 这是A::foo
的默认参数,即5,因为这是静态类型a
,即编译时已知的类型。如果您考虑一下,这是编译器的唯一选择,因为它不能对分配给a
的类型做出假设。B::foo
,因为a
指向的对象的动态类型为struct B
。因此你得到3 * 5作为输出。