我有一个带有许多继承派生类的基类。这样的事情:
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
就像编译器忽略被覆盖函数的默认参数一样 这是正常的,还是有些事我做错了或者我错过了?
答案 0 :(得分:8)
默认值是静态绑定的。换句话说,它们没有多态行为。这就是你看到
的原因 bar
bar
而不是派生类的虚函数中的那些默认值。
根据Effective C +:
如果默认参数值是动态绑定的,编译器必须想出一种方法来确定运行时虚函数参数的相应默认值,这比编译期间确定它们的当前机制要慢一些。