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

时间:2013-05-18 17:47:26

标签: c++ inheritance polymorphism virtual

我有一个带有许多继承派生类的基类。这样的事情:

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

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

1 个答案:

答案 0 :(得分:8)

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

的原因
 bar
 bar

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

根据Effective C +:

  

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