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



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

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/

这是两个类完全或部分地从一个基类继承,然后这个基类也有一个子类继承这两个类。创建菱形。

解决这个问题的办法是把virtual加到两个中产阶级的遗产中。导致:

class IParameterExpression : virtual public IMetaExpression

class Expr : virtual public IMetaExpression

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

我不是钻石问题的专家,所以希望能有更多的说明。

最新更新