【问题标题】:Default Argument in Virtual Function [duplicate]虚拟函数中的默认参数 [重复]
【发布时间】:2013-02-08 06:36:36
【问题描述】:

请帮我找出背后的原因:

#include <iostream>
using std::cout;

class A {
  public:
     virtual void fun(int a = 5) { cout<<a; }
};
class B::public A {
  public:
     void fun(int a = 10) {
        cout<<"Inside A::B::fun().\n";
        cout<<"\n"<<a;
     }
};
int _tmain(int argc, _TCHAR* argv[]) {
  A *obj = new B();
  obj->fun();
  reutrn 0;
}

虽然它正在调用 B::fun(),但仍然打印 5,这是为什么以及如何工作的。?

【问题讨论】:

  • 是的@Mark,我正在使用 MS VC++ 2010 Express

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


【解决方案1】:
A *obj = new B();
obj->fun();

在此代码中,fun() 被多态调用 - 调用者(仅)使用 A::fun() 的知识,但调用被分派到重定向到 B::fun() 实现的指针。该函数参数 - a / 5 - 由调用者在重定向调用之前提供(之前 - 在编译期间) - 看到 A 的默认值,而不是 B 的。

如果您想要一些您似乎期望的东西,您可能会发现使用A::fun(int a = -1) 或其他一些标记值是可行的,fun 的实现会检查标记值,然后根据需要将其替换为 5 或 10 .这样,特定于实现的值会在调用期间而不是之前合并。

【讨论】:

    【解决方案2】:

    默认参数不以动态调度行为为特征。它们是静态的。 Scott Meyers 在“Effective C++”中详细讨论了这一点

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多