为什么编译器将 class 视为抽象?

Why does compiler treat class as abstract?

我试图编译该程序,但编译器将 ParameterExpr class 视为抽象。我没有使用多重继承,我认为它应该可以工作(因为 get_type 实际上是在 Expr class 中实现的)

class IMetaExpression
{
public:
    virtual int get_type(void) = 0;
    virtual ~IMetaExpression(){}
};

class IParameterExpression : public IMetaExpression
{
public:
    virtual char get_parameter(void) = 0;
};
class Expr : public IMetaExpression
{
public:
    virtual int get_type(void) override { return 0; }
};
class ParameterExpr : public Expr, public IParameterExpression
{
public:
    virtual char get_parameter(void) override { return 'c';}
    //virtual int get_type(void) override { return 0; }
};
int main()
{
    auto p = new ParameterExpr();
    p->get_type();
    delete p;
    return 0;
}

我认为这是一个叫做钻石问题的问题。 https://www.geeksforgeeks.org/multiple-inheritance-in-c/

这是两个 class 完全或部分继承自基 class 的地方,然后还有一个 child class 继承了这两个 [=27] =]是的。创建菱形。

解决这个问题的方法是在两个中间 class 的继承中添加 virtual。结果:

class IParameterExpression : virtual public IMetaExpression

class Expr : virtual public IMetaExpression

这允许基 class 的构造函数只被调用一次,并在所有继承的 class 之间共享功能。

我不是钻石问题的专家,所以请多多说明。