0

main 的以下输出的答案是“i=10 的派生类显示”,但我不明白为什么?确定该函数是在基本类型上调用的吗?

在这里确定答案的思考过程是什么?

class base
{
  public:
         virtual void display(int i = 10)
         {
           cout<<"Base class display with i = "<<i<<endl;
         }

};

class derived : public base
{
  public:
          void display(int i = 20)
         {
           cout<<"Derived class display with i = "<< i <<endl;
         }

};

int main(int argc, char *argv[])
{
     base *bptr = new derived;
     bptr->display();

      return 0;
}
4

1 回答 1

2

看看虚函数可以有默认参数吗?

虚函数调用 (10.3) 在虚函数的声明中使用默认参数,由表示对象的指针或引用的静态类型确定。派生类中的覆盖函数不会从它覆盖的函数中获取默认参数。

因此,bptr->display();调用 的派生版本display,但使用来自base指针的静态类型的参数bptr

这是因为参数的默认值必须在编译时确定,而动态绑定则推迟到运行时。在同一个 virtual 的基版本和派生版本中使用不同的默认参数几乎肯定会造成麻烦。当通过引用或指向基的指针调用虚拟时可能会出现问题,但执行的版本是派生定义的版本。在这种情况下,为 virtual 的基本版本定义的默认参数将传递给使用不同默认参数定义的派生版本。

于 2013-08-05T20:13:49.713 回答