【问题标题】:Why does compiler treat class as abstract?为什么编译器将类视为抽象?
【发布时间】:2021-12-06 08:59:16
【问题描述】:

我尝试编译程序,但编译器将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;
}

【问题讨论】:

  • int get_type()char get_parameter() 不是同一类型
  • ParameterExpr 继承自 IParameterExpression,它有一个纯虚成员函数 get_type,它本身继承自 IMetaExpression。因为ParameterExpr 没有实现那个纯虚成员函数,所以它使那个类abstract。缺少get_typeExpr::get_type 无关。
  • @Eljay 但 ParameterExpr 的基类实际上实现了方法 get_type。这就是我认为 ParameterExpre 自动实现 get__type 的原因
  • 那是一个不同的get_type。如果您希望它与get_type 相同,则需要使用虚拟继承

标签: c++ inheritance


【解决方案1】:

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

这是两个类完全或部分继承自一个基类的地方,该基类也有一个子类继承这两个类。创建菱形。

对此的解决方案是在两个中间类的继承中添加virtual。结果:

class IParameterExpression : virtual public IMetaExpression

class Expr : virtual public IMetaExpression

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

我不是钻石问题方面的专家,因此请提供更多说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多