2016-12-08 7 views
0
class Base { 
    static std::vector<std::string> filter; 

    virtual bool check() { 
     if(std::find(filter....)) 
    } 
} 

class Derived : public Base { 
    static std::vector<std::string> filter; 

    bool check() override { 
     if(std::find(filter....)) 
    } 
} 

両方の静的変数がそれぞれの変換単位で定義されているものとします。基本クラスと派生クラスで同じ名前の静的メンバ変数

基本クラスと派生クラスに同じ名前を持つ静的な文字列のベクトルは、クラスごとに異なる値を持つ同じタイプの情報を持つために用意されています。非仮想的な関数の名前が隠れているのは良い考えではありません。静的メンバー変数にも同じことが当てはまりますか?もしそうなら、代替案は何か?

+3

で仮想メソッドを使用することができます

あなたはおそらく*あなたは子クラスで 'filter'メンバーを持っている理由*あなた自身に尋ねることから始めなければなりません。なぜあなたは基本クラスの1つを使用できませんか?彼らはさまざまな目的のためですか?または、基本的に同じ(または同じ種類の)データを格納していますか? –

+0

私は同じ種類のデータを保存するという質問に答えました!クラスのインスタンスではなくクラスの型にのみ依存する値なので、同じ値 – mkmostafa

+0

はありません – mkmostafa

答えて

0

はい、仮想以外の機能をシャドウするのを避ける同じ理由は、(仮想ではない)メンバーにも当てはまります。

私は、Derivedのcheck()のオーバーライドが、Baseのそれと文字通り同じであると仮定します。あなたが代わりに静的地元

class Base 
{ 
    // ... 

    virtual /*const?*/ std::vector<std::string> & filter() 
    { 
     static std::vector<std::string> value = ... 
     return value; 
    } 
    bool check() // final 
    { 
     if(std::find(filter()...)) 
    } 
} 

class Derived : public Base 
{ 
    /*const?*/ std::vector<std::string> & filter() // override 
    { 
     static std::vector<std::string> otherValues = ... 
     return otherValues; 
    } 
} 
+0

私は同じことをやろうと思った。仮想関数(チェック)の静的な値を直接定義するだけで動作しますか? – mkmostafa

+0

"あなたはどこでも小切手のボディを繰り返さなければならない"という問題に戻ることがあります。問題 – Caleth

+0

@Stargateur良い点。おそらくconstでも良い測定のために – Caleth

関連する問題