无法声明为抽象类型

3
我收到了以下错误信息:
error: cannot declare variable 'b' to be of abstract type 'B'
note: because the following virtual functions are pure within 'B'
note: virtual bool Serializable::eq(const QString&) const
      virtual bool eq( const QString & qs) const = 0;
                   ^
note: virtual bool Serializable::eq(const Serializable*) const
      virtual bool eq( const Serializable * o) const = 0;
                   ^

在这段代码上:
class Serializable {
public:
    virtual  bool eq( const QString & qs) const = 0;
    virtual  bool eq( const Serializable * o) const = 0;
};

class JSONSerializable : public Serializable {
public:
    virtual  QString toJSON( void) const = 0;

    virtual  bool eq( const QString & qs) const {
                 return toJSON() == qs;
             }
    virtual  bool eq( const Serializable * o) const {
                 return eq( (( JSONSerializable *) o)->toJSON());
             }
};

class A : public Serializable {  };

class B : public A,
          public JSONSerializable {
public:
    virtual  QString toJSON( void) const {
                 return QString( "test!");
             }
};

…
B b;
qDebug() << b.toJSON();
…

我理解这是因为纯虚方法或多重继承的原因。这个错误真的让我很难过,我应该如何解决?非常感谢你的帮助!

1个回答

2
问题在于B类两次继承抽象类Serializable
  • 一次是通过其基类A
  • 还有一次是通过其另一个基类JSONSerializable
因此,您必须两次覆盖Serializable的两个纯虚方法。
由于您提出了B类剩余抽象的问题,我理解您并不打算这样做:您只想让B类像接口一样只继承一次Serializable,并使用JSONSerializable的实现来“混入”其他功能。如果是这种情况,您需要以虚拟方式继承Serializable,如下所示:
class Serializable {
public:
    virtual  bool eq( const QString & qs) const = 0;
    virtual  bool eq( const Serializable * o) const = 0;
};

class JSONSerializable : virtual public Serializable {
public:
    virtual  QString toJSON( void) const = 0;

    virtual  bool eq( const string & qs) const {
                 return toJSON() == qs;
             }
    virtual  bool eq( const Serializable * o) const {
                 return eq(dynamic_cast<const JSONSerializable*>(o)->toJSON());
             }
};

class A : virtual public Serializable {  };

class B : virtual public A,
          public JSONSerializable {
public:
    virtual  QString toJSON( void) const {
                 return QString( "test!");
             }
};

添加了 virtual 关键字,指示编译器您只想在类 B 中包含一个“副本”Serializable 基类。
这个更改修复了问题(demo)。

谢谢你,@dasblinkenlight,这很有帮助!你是对的,我试图混合功能。 - Valentin T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接