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;
    }
};

簡潔にするために、2 つのクラスだけを継承しました。
これがメインです:

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 に答える