为什么编译器将 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 之间共享功能。
我不是钻石问题的专家,所以请多多说明。
我试图编译该程序,但编译器将 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 之间共享功能。
我不是钻石问题的专家,所以请多多说明。