我想实现一个抽象类,但是不能覆盖纯粹的虚函数。因此,编译器将我的类AddDialog_av视为抽象类。

似乎编译器在AddDialog_av.cpp文件中看不到定义。

AddDialog.h(应该是抽象类):

class AddDialog : public QDialog
{
    Q_OBJECT

public:
    AddDialog(QWidget *parent = 0);
    virtual ~AddDialog();

protected:
    virtual QString generateId()=0;
    virtual bool validate()=0;

private slots:
    void addButton_clicked();
    void cancelButton_clicked();

};

AddDialog_av.h(应该实例化):
#include <adddialog.h>

class AddDialog_av : public AddDialog
{
public:
    AddDialog_av();

};

AddDialog_av.cpp:
#include <adddialog_av.h>

bool AddDialog_av::validate()
{
    return true;
}

QString AddDialog_av::generateId()
{
    return "Fork out of here.";
}

main.cpp
#include "adddialog_av.cpp"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    AddDialog_av w;
    w.show();

    return a.exec();
}

错误 list :
adddialog_av.cpp:3: error: no 'bool AddDialog_av::validate()' member function declared in class 'AddDialog_av'
    bool AddDialog_av::validate()
                                 ^
adddialog_av.cpp:8: error: no 'QString AddDialog_av::generateId()' member function declared in class 'AddDialog_av'
         QString AddDialog_av::generateId()
                                          ^
main.cpp:7: error: cannot declare variable 'w' to be of abstract type 'AddDialog_av'
         AddDialog_av w;
                      ^

最佳答案

您必须在AddDialog_av类的声明中将覆盖的内容告知编译器。提供您尝试执行的实现方式(即仅在CPP文件中指定实现)将无法正常工作,因为编译器甚至都不知道AddDialog_av类首先具有AddDialog_av::generateId()AddDialog_av::validate函数。 AddDialog_av从基类AddDialog继承它们的事实并不意味着您打算在派生类中提供实现。

您还必须将函数添加到头文件中:

class AddDialog_av : public AddDialog
{
public:
    AddDialog_av();
protected:
    virtual QString generateId();
    virtual bool validate();
};

07-28 01:33
查看更多