Qt中对vtable的未定义引用

时间:2013-03-27 10:42:48

标签: c++ qt

我收到虚拟表错误,而我无法检测到代码中的任何错误。有人能给我一个正确的方向吗?对于荷兰语术语很抱歉,希望这不是问题。

#ifndef LIJST_H
#define LIJST_H

#include "product.h"
#include <list>

typedef list<Product*> lijst;

#endif // LIJST_H

// Methode

#ifndef METHODE_H
#define METHODE_H

#include "lijst.h"

class Methode
{
public:
    Methode() {}
    virtual ~Methode() {}
    virtual double run(lijst *items);
};

#endif // METHODE_H

// Productmethode
#ifndef PRODUCTMETHODE_H
#define PRODUCTMETHODE_H

#include "methode.h"

class ProductMethode : public Methode
{
private:
    map<string,double> kortingsTabel;
public:
    ProductMethode() {}
    void addKorting(string naam, double korting);
    double run(lijst *items);
};

// Main
#include <QCoreApplication>
#include "factuur.h"
#include "product.h"
#include "globalemethode.h"
#include "productmethode.h"
#include "drempelmethode.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    GlobaleMethode G ( 0.1 );
    ProductMethode P;
    P.addKorting ( "Melk", 0.1 );
    P.addKorting ( "Boter", 0.05 );
    Factuur F ( &G );
    F.addProduct ( new Product ( "Melk", 0.75 ) );
    F.addProduct ( new Product ( "Kaas", 5 ) );
    F.addProduct ( new Product ( "Boter", 1.7 ) );
    cout << F.totaal ( ) << endl;
    F.setMethode ( &P );
    cout << F.totaal ( );

    return a.exec();
}

1 个答案:

答案 0 :(得分:4)

您刚刚在课程Methode中声明了一个方法:

virtual double run(lijst *items);

该方法也需要定义。只允许纯虚函数没有定义。

此外,通常会使用virtual来覆盖派生类的某些基类方法的行为,但在您的示例中,您没有为重叠的virtual方法提供定义。你应该。如果您不需要那么为什么要开始使用方法virtual?它不一定是virtual


好读:

<强> What does it mean that the "virtual table" is an unresolved external?