2017-12-06 15 views
0

私にはわからない作業コードがあります。モックアップされたバージョンについては下記を参照してください。それのJISTは私がFooのインスタンスを持っているFooクラス、ChildFooクラスとBarクラスを持っています。 Fooは、Barにいくつかのキーを提示し、json辞書を解析します。 Barは汎用であり、複数の方法で使用され、Fooは実装ごとにサブクラス化されています。 子クラスのpublic static constメンバーをオーバーライドします

私は Barメソッドが値を解析だけで特定のキーの代わりに独自の名前を使用するために、その場合には ""Foopublic static const std::string、デフォルト値を持っています。私はを ChildFooに置き換えます。なぜなら、json辞書はより複雑で、 {value: [], type:[], ...}を提供するからです。他の実装はちょうど {mName: []}を返します。

foo.hという:

class Foo 
{ 
public: 
    static const std::string PARAM_VALUE; 
} 

Foo.cpp:

const std::string Foo::PARAM_VALUE = ""; 

Foo::Foo() 
{ 
... 
} 

ChildFoo.cpp:

const std::string Foo::PARAM_VALUE = "value"; 

ChildFoo::ChildFoo() : Foo() 
{ 
... 
} 

Bar.h

class Bar 
{ 
private: 
    std::string mName; 
    ChildFoo * mFoo; 
} 

Bar.cpp:私はこれらのキーの仮想ゲッターのルートを下に行かなければならないだろうと仮定が、私はこれを試してみるだろうと思ったし、それが動作を見つけるために少し驚いた

Bar::Bar() 
{ 
... 
} 

int Bar::parseValue() 
{ 
    std::string key; 
    if (!mFoo->PARAM_VALUE.empty()) { 
     key = mFoo->PARAM_VALUE; 
    } 
    else { 
     key = mName; 
    } 
    ... 
} 

。コンパイル時にはがChildFooによってオーバーライドされているので、それは考えられます。constはその時点では制限されていません。しかし、私は完全には分かりません。

これはうまくいかないのですか?これはOKと考えられますか?この方法で何かをすることから来るかもしれない欠点はありますか?

乾杯、 ゲイリー

+0

リンクしていますか?あなたは 'const std :: string Foo :: PARAM_VALUE' - > ODR違反の複数の(異なる)定義を持っています。 – Jarod42

+0

それは私が望むようにコンパイルして実行します。 – GDYendell

答えて

1

私はあなたのリンカがこれを許可することを確信していないそれがない場合、動作は確かに定義されていません。

コードがの定義ルールに違反しています。

必要に応じて可変シャドウイングにアクセスできますが、多態性ではないことに注意してください。多態性が必要な場合は、仮想関数を使用する必要があります。

+0

異なるコンパイラがこれについて不平を言う可能性はありますか?私はgcc(GCC)4.4.7 20120313(Red Hat 4.4.7-18)を使用しています。 – GDYendell

+0

正式には苦情を提出するリンクステージです。 – Bathsheba

関連する問題