編集: 以下のコメントで DyP が指摘したように、これは c3(SoccerWorld) の関数定義の単なるタイプミスでした。
c1
たとえば、仮想関数を持つクラスがありf
ます。- 別のクラスは
c2
から継承しc1
、別のクラスは からc3
継承しc2
ます。 c2
には仮想機能がありませんが、いくつかの変更f
を加えて追加したいと考えてc3
います。- の仮想関数は純粋
f
でc1
はなく、 で定義されていc1.cpp
ます。私もまだにいる必要がありf
ますc1
。
ではなくに追加f
すると、未解決の外部シンボル エラーが発生します。に仮想関数としても追加すると、2 つのエラーが発生します。c3
c2
f
c2
c1.obj
f
c3
c1
、c2
、c3
は次のようになります。
class C1 {
virtual void f() { ... }
};
class C2 : public C1 {
//No virtual f
};
class C3 : public C2 {
virtual void f() { /*Do something*/ }
};
実数関数:
AbstractKart *World::createKart(const std::string &kart_ident, int index, int local_player_id, int global_player_id, RaceManager::KartType kart_type)
{ ... }
これはクラス World にあります。クラス WorldWithRank は World を継承しており、createKart 関数はありません。クラス SoccerWorld は WorldWithRank から継承します。これに createKart を持たせて、SoccerWorld の場合は別の方法でカートを配置します。
createKart は World で保護されています。
エラー:
world.obj : error LNK2005: "protected: virtual class AbstractKart * __thiscall World::createKart(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,int,int,enum RaceManager::KartType)" (?createKart@World@@MAEPAVAbstractKart@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHHW4KartType@RaceManager@@@Z) already defined in soccer_world.obj
soccer_world.obj : error LNK2001: unresolved external symbol "protected: virtual class AbstractKart * __thiscall SoccerWorld::createKart(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int,int,int,enum RaceManager::KartType)" (?createKart@SoccerWorld@@MAEPAVAbstractKart@@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HHHW4KartType@RaceManager@@@Z)