C++ 有没有办法不在继承的类中重复代码

C++ 有没有办法不在继承的类中重复代码,c++,inheritance,C++,Inheritance,我有一个抽象类A和从类A继承的两个类,分别是B和C。让我们离开B班,仔细看看C班。我有两个从类Cw继承的类,它们是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: c

我有一个抽象类A和从类A继承的两个类,分别是BC。让我们离开B班,仔细看看C班。我有两个从类Cw继承的类,它们是C1C2等等

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调用get_symbol()方法时,C2。。。对象我从C获得一个方法和一些随机字符。我必须写:

char get_symbol() { return symbol;}
用于所有Cn类获取其实际符号

我的问题是:有没有办法避免代码冗余并获得Cn对象的正确符号(C类型对象甚至没有符号)


关于

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 = '#';
};
结构A{ 虚拟字符get_symbol()const=0; }; 模板 结构C:公共A{ 虚拟字符get_symbol()常量重写{ 返回静态_cast(*this).symbol; } }; 结构C1:public{ 字符符号='#'; };
您正在“重载”符号的含义。你在C班有一个想法,但在C1班显然有一个不同的想法。(PS你怎么能有
char-symbol='C1'
-这甚至可以编译吗?)你是对的,我刚刚给出了一个愚蠢的符号值示例。不使用真正的代码总是一个陷阱-你可能会让人们投票关闭,因为你的代码无效。最好给出一个真正的代码段。从
a
中删除未使用的
symbol
变量,这只会导致问题。还要注意,您得到的“随机字符”是因为您没有将
a::symbol
设置为任何值,因此它会拾取堆栈内存中已经存在的任何值。