2016-11-11 122 views
2

我有一個抽象類一個和2類,從A類wchich是Ç繼承。讓我們離開B班,仔細看看C。我有幾個從C類 wchich是C1繼承類,C2等等...是否有某種方式不重複的代碼繼承類

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 ...對象我從C和一些隨機字符得到的方法。我必須寫:

char get_symbol() { return symbol;} 

爲所有的Cn類獲得他們的實際符號。

我的問題是:是否有任何解決方案,以避免代碼冗餘,並得到道道對象的正確的符號(在ç類型的對象,甚至沒有自己的符號)

問候

+0

您'重載'符號的含義。你在C班有一個想法,但在C1班上顯然是一個不同的想法。 (PS你怎麼能有'char symbol ='C1' - - 甚至編譯?) – John3136

+0

你是對的,我只是給了一個愚蠢的符號值的例子。 – Dontumindme

+0

不使用真正的代碼總是一個陷阱 - 你可能會讓人們投票結束,因爲你的代碼是無效的。總是更好地給一個真正的片段。 – John3136

回答

2

CRTP又名靜態繼承可以在這裏幫助:

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 = '#'; 
}; 
相關問題