web-dev-qa-db-ja.com

C ++ Untable Reference to vtable and inheritance

ファイルA.h

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif

ファイルChild.h

#ifndef CHILD_H_
#define CHILD_H_

#include "A.h"

class Child: public A {
private:
    int x,y;
public:
    Child();
    ~Child();
    void doWork();
};
#endif

そしてChild.cpp

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};

コンパイラは、Aのvtableへの未定義の参照があると言います。私はさまざまなことを試しましたが、まだ何も機能していません。

私の目的は、クラスAがインターフェイスになり、実装コードをヘッダーから分離することです。

29
rjmarques

エラーの原因と解決方法/

_class A_のすべての仮想関数に対してdefinitionsを提供する必要があります。純粋な仮想関数のみに定義を許可しません。

すなわち:_class A_両方のメソッド:

_virtual ~A();
virtual void doWork();
_

定義する必要があります(本体が必要です)

例えば。:

A.cpp

_void A::doWork()
{
}
A::~A()
{
}
_

警告:
_class A_をインターフェイスとして機能させたい場合(別名C++では抽象クラス)メソッドを純粋な仮想にします。

_virtual void doWork() = 0;
_

Good Read:

「仮想テーブル」が未解決の外部であることはどういう意味ですか?
C++をビルドするとき、リンカは私のコンストラクタ、デストラクタ、または仮想テーブルが未定義であると言います。

69
Alok Save

その場合、クラスAでメンバー関数を純粋仮想として作成します。

class A { // ... virtual void doWork() = 0; }; .

6
Mahesh

他の応答が役に立たない場合は、「*。gch」ファイルを必ず削除してください。