2013-05-18 6 views
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 

ただ、コンパイラは、オーバーライド機能のデフォルト引数を無視する方法があればのように。
これは正常なのでしょうか、間違っていることや欠けていることがありますか?

+1

デフォルトの引数は、関数シグネチャを異なるものにする場合があります。警告を最大にして再コンパイルしてください。 –

+0

@ThomasMatthews:解決方法は?基本クラスの仮想関数のデフォルト引数を削除し、継承されたオーバーライドされた関数のままにしておけばよいですか? – Overflowh

+0

@Overflowh:実験を試してください:関数シグネチャのデフォルトの割り当てを削除し、再テストしてください。 –

答えて

8

デフォルト値は静的にバインドされています。言い換えれば、それらは多態的な行動を持たない。そのため、派生クラスの仮想関数のデフォルト値ではなく、

bar 
bar 

の代わりに、効果的なC +による

デフォルトのパラメータ値を動的にバインドされた場合、コンパイラが遅くなり、実行時に仮想関数のパラメータに適切なデフォルト値を決定する方法、を考え出す必要がありますコンパイル中にそれらを決定する現在のメカニズムより複雑です。

関連する問題