2016-11-11 51 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 = '#'; 
}; 
相关问题