多态性和默认值:可以共存吗?

Ove*_*owh 5 c++ polymorphism virtual inheritance

我有一个基类,有许多继承的派生类.像这样的东西:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

为简洁起见,我只继承了两个类.
这是主要的:

A* aArray[] = {
    new B,
    new C,
};

int main() {
    aArray[0]->f();
    aArray[0]->f();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,我得到的输出是:

bar
bar
Run Code Online (Sandbox Code Playgroud)

就像编译器忽略被覆盖函数的默认参数一样.
这是正常的,还是有些事情我做错了或者我错过了?

tao*_*ocp 8

默认值是静态绑定的.换句话说,它们没有多态行为.这就是你看到的原因

 bar
 bar
Run Code Online (Sandbox Code Playgroud)

而不是派生类的虚函数中的那些默认值.

根据Effective C +:

如果默认参数值是动态绑定的,编译器必须想出一种方法来确定运行时虚函数参数的适当默认值,这比编译期间确定它们的当前机制要慢一些.