Qt 5 中构造函数的 C++ 抽象 Class 错误
C++ Abstract Class error on Constructor in Qt 5
我正在创建一个名为 Asset 的简单抽象 class,header 代码如下所示:
#ifndef ASSET_H
#define ASSET_H
#include <QString>
#include <QDate>
class Asset
{
public:
Asset(QString des, QDate dat);
~Asset();
virtual QString toString();
virtual double value();
QString getDescription();
private:
QString description;
protected:
QDate date;
};
#endif // ASSET_H
这是我的实现文件的样子:
#include "asset.h"
Asset::Asset(QString des, QDate dat)
{
description = des;
date = dat;
}
QString Asset::getDescription()
{
return description;
}
我在实现构造函数上得到的错误代码是:undefined reference to vtable for Asset
我做错了什么?
您未在抽象 class 中实现的方法应该是纯 virtual
方法。这意味着它们后面应该跟着 = 0
.
例如:
virtual double value() = 0;
这告诉编译器这是一个纯虚方法。有关虚拟方法和纯虚拟方法之间区别的解释,请查看这个 Whosebug 答案:C++ Virtual/Pure Virtual Explained
旁注。当你有一个抽象 class 时,你真的应该确保你的析构函数是虚拟的。处理要从中继承的 class 时,始终在 C++ 中使用虚拟析构函数。
在您的 class 设计中,您有一个名为 description 的私有成员,以及一个 public 函数来获取非虚拟的描述。您没有设置描述的方法,也许您应该考虑将描述成员变量从 private
移动到 protected
或者甚至创建一个 mutator 函数来设置它。
我正在创建一个名为 Asset 的简单抽象 class,header 代码如下所示:
#ifndef ASSET_H
#define ASSET_H
#include <QString>
#include <QDate>
class Asset
{
public:
Asset(QString des, QDate dat);
~Asset();
virtual QString toString();
virtual double value();
QString getDescription();
private:
QString description;
protected:
QDate date;
};
#endif // ASSET_H
这是我的实现文件的样子:
#include "asset.h"
Asset::Asset(QString des, QDate dat)
{
description = des;
date = dat;
}
QString Asset::getDescription()
{
return description;
}
我在实现构造函数上得到的错误代码是:undefined reference to vtable for Asset
我做错了什么?
您未在抽象 class 中实现的方法应该是纯 virtual
方法。这意味着它们后面应该跟着 = 0
.
例如:
virtual double value() = 0;
这告诉编译器这是一个纯虚方法。有关虚拟方法和纯虚拟方法之间区别的解释,请查看这个 Whosebug 答案:C++ Virtual/Pure Virtual Explained
旁注。当你有一个抽象 class 时,你真的应该确保你的析构函数是虚拟的。处理要从中继承的 class 时,始终在 C++ 中使用虚拟析构函数。
在您的 class 设计中,您有一个名为 description 的私有成员,以及一个 public 函数来获取非虚拟的描述。您没有设置描述的方法,也许您应该考虑将描述成员变量从 private
移动到 protected
或者甚至创建一个 mutator 函数来设置它。