为什么我的课被认为是抽象的

Why is my class considered abstract?

本文关键字:认为是 抽象的 我的 为什么      更新时间:2023-10-16

我想实现一个抽象类,但不能覆盖纯粹的虚函数。出于这个原因,编译器将我的类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.";
}

主.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();
}

错误列表:

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();
};
<</div> div class="answers">

如果你有 =0,你必须派生和实现基类 AddDialog。所以添加

class MyAddDialog : public AddDialog
{
protected:
    QString generateId(){
qDebug() << "works :)";
};
    virtual bool validate(){
qDebug() << "works to :) :)";
};
};

并使用:

MyAddDialog myAddDialog;

在代码中。然后它将运行。不要声明

AddDialog addDialog; // it will not works!!!!