1

私は以下のコードを持っています:

// IBase.h
#include <iostream>

class IBase{
    public:
           virtual string getId();
};

// IBase.cpp
#include "IBase.h"
string IBase::getId(){};

// Base.h
#include <iostream>
#include <string>
#include "IBase.h"

using namespace std; 
class Base : public IBase{
    protected:
           string id;
    public:
           Base(string _id);
           string getId();
};

// Base.cpp
#include "Base.h"

Base::Base(string _id){
    id = _id;  
}
string Base::getId(){
    return id;
}

// Base2.h
#include <iostream>
#include <string>
#include "Base.h" 
using namespace std;

class Base2 : public Base{
    public:
          Base2(string _id);
          string getId(); 
}; 

// Base2.cpp
#include "Base2.h"
Base2::Base2(string _id) : Base(_id){};

そして、プロジェクトをコンパイルすると、Base2 の `vtable への Undefined 参照を取得しました! これは何かが恋しいですか?

4

2 に答える 2

1

通常、vtable への未定義の参照は、最初の仮想関数 (vtable が通常格納される場所) がリンクされていないことを示します。

の定義Base2::getIdが提供されていないため (最初の仮想関数)、vtable はリンクされません。

クラス定義で関数の定義を追加するかBase2::getId、関数の宣言を削除してください。

于 2012-06-12T02:24:40.987 に答える
1

関数宣言には定義が必要です。それ以外の場合、宣言は関数定義 (おそらくベースから継承されたもの) を単に抑制します。次のオプションがあります。

  • string getId();fromBase2クラス宣言を削除するか、または
  • 関数を自分で定義するか、
  • 次のような using 宣言を介して、適切な基本クラスから特定の定義をインポートします。using Base::getId;

また、次の点にも注意してください。

 string IBase::getId(){};
  • return ステートメントを定義する必要があります (そして に変換可能なオブジェクトを返しますstring)
  • 定義の後にセミコロンは必要ありません
于 2012-06-12T02:29:53.403 に答える