我有这些课程:
class Base
{
public:
virtual void foo(int x = 0)
{
printf("X = %d", x);
}
};
class Derived : public Base
{
public:
virtual void foo(int x = 1)
{
printf("X = %d", x);
}
};Run Code Online (Sandbox Code Playgroud)
当我有:
Base* bar = new Derived();
bar->foo();Run Code Online (Sandbox Code Playgroud)
我的输出是"X = 0",即使从Derived调用foo,但是当我有:
Derived* bar = new Derived();
bar->foo();Run Code Online (Sandbox Code Playgroud)
我的输出是"X = 1".这种行为是否正确?(从声明类型中选择默认参数值,而不是从实际对象类型中选择它).这会打破C++多态吗?
如果某人使用虚函数而未指定实际的函数参数并使用函数的默认参数,则会导致许多问题.
即使重写函数,也会保留默认参数!这种行为是正确的.让我从C++标准中搜索引用.
来自C++标准的§8.3.6/ 10 [默认参数]说,
虚函数调用(10.3)使用由表示对象的指针或引用的静态类型确定的虚函数声明中的默认参数 .派生类中的重写函数不会从它覆盖的函数中获取默认参数.
标准本身的例子
struct A {
virtual void f(int a = 7);
};
struct B : public A {
void f(int a);
};
void m()
{
B* pb = new B;
A* pa = pb;
pa->f(); //OK, calls pa->B::f(7)
pb->f(); //error: wrong number of arguments for B::f()
}
Run Code Online (Sandbox Code Playgroud)
此外,不仅保留它,每次调用函数时都会对其进行评估:
§8.3.6/ 9说,
每次调用函数时都会计算默认参数