具有默认参数的虚函数,奇怪的输出

时间:2016-09-02 01:43:26

标签: c++ language-lawyer virtual-functions default-arguments

此代码的输出为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;
}

2 个答案:

答案 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作为输出。