5

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

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

就像编译器忽略被覆盖函数的默认参数一样。
这是正常的,还是我做错了什么或我错过了什么?

4

1 回答 1

8

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

 bar
 bar

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

根据有效 C+:

如果默认参数值是动态绑定的,编译器将不得不想出一种方法来在运行时确定虚函数参数的适当默认值,这将比在编译期间确定它们的当前机制更慢且更复杂。

于 2013-05-18T17:50:03.330 回答