2016-11-11 9 views
2

でコードを繰り返すないいくつかの方法です。クラスBを離れ、クラスCを詳しく見てみましょう。私はクラスC C1あるwchichから継承したクラスのカップルなので、上のC2とを...持っては私が<strong>B</strong>と<strong>C</strong>あるwchichクラスAを継承する抽象クラス<strong></strong>と2クラスを持っているが継承したクラス

class A{ 
protected: 
char symbol; 
public: 
virtual char get_symbol() = 0; 
}; 

class C : public A{ 
public: 
virtual char get_symbol() { return symbol;} 
}; 

class C1 : public C{ 
protected: 
char symbol = '#'; 
}; 

の問題は、私がためget_symbol()メソッドを呼び出したいときC1C2 ...オブジェクト私はといくつかのランダムな文字からメソッドを取得しています。私は書かなければならない:

char get_symbol() { return symbol;} 

実際のシンボルを得るためには、すべてのCnクラスが必要です。

私の質問は次のとおりです。コードの冗長性を回避し、Cnのオブジェクトの適切なシンボルを取得するためのすべてのソリューションは、

よろしく

+0

あなたは 'シンボル'の意味を「オーバーロード」しています。あなたはクラスCで1つのアイデアを持っていますが、明らかにクラスC1では異なるアイデアです。 (PSはどのように 'char symbol = 'C1'を持つことができますか?それはコンパイルされますか?) – John3136

+0

あなたは正しいです、私はちょうど愚かなシンボル値の例を与えました。 – Dontumindme

+0

実際のコードを使用しないのは常にトラップです。あなたのコードが有効でないため、人がタイプミスなどで閉じると投票することがあります。本当のスニペットを与えるのが常に良い。 – John3136

答えて

2

CRTP別名(C型オブジェクトでも彼のシンボルを持っていない)があります静的継承はここに役立ちます:

struct A{ 
    virtual char get_symbol() const = 0; 
}; 

template<typename Derived> 
struct C : public A{ 
    virtual char get_symbol() const override { 
     return static_cast<Derived const&>(*this).symbol; 
    } 
}; 

struct C1 : public C<C1>{ 
    char symbol = '#'; 
}; 
関連する問題