c++ - 不能声明为抽象类型

标签 c++ inheritance virtual abstract pure-virtual

我收到以下错误:

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();
…

我明白这是因为纯虚方法或/和多重继承。这个错误真的让我哭笑不得。我怎样才能让它消失?如果能提供一些帮助,我将不胜感激!

最佳答案

问题是B继承了抽象类Serializable两次:

  • 一旦通过它的基类A,并且
  • 再次通过它的另一个基类JSONSerializable

因此,您必须重写 Serializable 的两个纯虚函数两次。

既然你问的是关于 B 的剩余抽象的问题,我的理解是你不打算那样做:你想让 B 继承 Serializable 仅一次,就好像它是一个接口(interface),并使用 JSONSerializable 的实现来“混入”附加功能。如果是这种情况,您需要继承 Serializable virtually,如下所示:

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 关键字指示编译器您只希望将 Serializable 基的一个“拷贝”包含在您的类 B 中。

此更改解决了问题 ( demo)。

关于c++ - 不能声明为抽象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658798/

相关文章:

c++ - 就像一个结构数组而不声明数组

ROOT 类的 C++ 赋值运算符

C++ 不允许我从基类调用公共(public)方法

linux - 模拟麦克风(虚拟麦克风)

linux - postfix 虚拟文件中模式的问题

c++ - 将 Qscintilla 库添加到 Qt Problems

c++ - 类模板特化内部的静态成员函数

c++ - OpenSSL 在客户端和服务器之间建立连接

c++ - 模板特化和从其他模板类继承模板类

c++ - 具有多态性的派生类中的重载函数 (C++)