以下主要输出的答案是“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;
}
答案 0 :(得分:2)
查看Can virtual functions have default parameters?:
虚函数调用(10.3)使用的默认参数 声明由静态类型确定的虚函数 表示对象的指针或引用。最重要的功能 在派生类中,不从中获取默认参数 功能它覆盖。
因此,bptr->display();
调用display
的派生版本,但使用base
中的参数,指针bptr
的静态类型。
这是因为参数的默认值必须在编译时确定,而动态绑定则延迟到运行时。在同一虚拟的基础和派生版本中使用不同的默认参数几乎保证会导致麻烦。通过引用或指向base的指针调用virtual时可能会出现问题,但执行的版本是派生的版本。在这种情况下,为虚拟基本版本定义的默认参数将传递给派生版本,派生版本是使用不同的默认参数定义的。