我有一个抽象类 A 和2个继承自A类的类,其中 B 和 C 。让我们离开B班,仔细看看课程 C 。我有几个继承自 C 类的课程 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 = '#';
};
问题在于,当我想为 C1 , C2 ...对象调用get_symbol()方法时,我从 C <获取方法/ strong>和一些随机字符。我必须写:
char get_symbol() { return symbol;}
让所有Cn类获得它们的实际符号。
我的问题是:是否有任何解决方案可以避免代码冗余并获得Cn对象的正确符号( C 类型对象甚至没有他的符号)
此致
答案 0 :(得分:2)
CRTP aka静态继承可以在这里提供帮助:
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 = '#';
};