0

コードの障害を検出できないのに、仮想テーブルエラーが発生します。誰かが私に正しい方向へのポイントを与えることができますか?オランダ語の用語で申し訳ありませんが、問題ではないことを願っています。

#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();
}
4

1 に答える 1

4

クラスでメソッドを宣言しましたMethode

virtual double run(lijst *items);

メソッドも定義する必要があります。純粋仮想関数のみが定義なしで許可されます。

また、通常virtual、派生クラスの特定の基本クラスメソッドの動作をオーバーライドするために使用しますが、この例では、オーバーライドされたメソッドの定義を提供していませんvirtual。あなたがすべき。必要がないのなら、なぜvirtualそもそもメソッドを作ったのですか?である必要はありませんvirtual


良い読み物:

「仮想テーブル」が未解決の外部であるとはどういう意味ですか?

于 2013-03-27T10:45:06.767 に答える