我收到以下错误:
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/