ファイル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
がインターフェイスになり、実装コードをヘッダーから分離することです。
エラーの原因と解決方法/
_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++をビルドするとき、リンカは私のコンストラクタ、デストラクタ、または仮想テーブルが未定義であると言います。
その場合、クラスAでメンバー関数を純粋仮想として作成します。
class A {
// ...
virtual void doWork() = 0;
};
.
他の応答が役に立たない場合は、「*。gch」ファイルを必ず削除してください。