【发布时间】:2013-05-13 16:41:26
【问题描述】:
我有一个基类,其中包含许多继承的派生类。像这样:
class A {
public:
virtual void f(string foo = "bar") {
cout << foo << endl;
}
};
class B: public A {
public:
void f(string foo = "howdy") {
cout << foo << endl;
}
};
class C: public A {
public:
void f(string foo = "something") {
cout << foo << endl;
}
};
为了简洁起见,我只继承了两个类。
这是主要的:
A* aArray[] = {
new B,
new C,
};
int main() {
aArray[0]->f();
aArray[0]->f();
return 0;
}
当我运行程序时,我得到的输出是:
bar
bar
就像编译器忽略被覆盖函数的默认参数一样。
这是正常的,还是我做错了什么或者我遗漏了什么?
【问题讨论】:
-
默认参数可能使函数签名不同。将警告调到最大并重新编译。
-
@ThomasMatthews:那么解决方案可能是什么?把基类虚函数中的默认参数去掉,保留在继承的重写函数中就可以了吗?
-
@Overflowh:做个实验:去掉函数签名中的默认赋值,重新测试。
-
@ThomasMatthews:我首先尝试仅删除基类中的默认参数,但它不起作用。然后我尝试删除 all 程序中的默认参数,但错误仍然存在。如果现在它打印正确的值。
-
@ThomasMatthews:好的,经过一番尝试,现在一切正常。响应是默认参数不能放在任何地方。无论是在基类中还是在派生类中,否则编译器会抱怨说函数具有不同的签名。
标签: c++ inheritance polymorphism virtual