編集: 以下のコメントで DyP が指摘したように、これは c3(SoccerWorld) の関数定義の単なるタイプミスでした。
c1たとえば、仮想関数を持つクラスがありfます。- 別のクラスは
c2から継承しc1、別のクラスは からc3継承しc2ます。 c2には仮想機能がありませんが、いくつかの変更fを加えて追加したいと考えてc3います。- の仮想関数は純粋
fでc1はなく、 で定義されていc1.cppます。私もまだにいる必要がありfますc1。
ではなくに追加fすると、未解決の外部シンボル エラーが発生します。に仮想関数としても追加すると、2 つのエラーが発生します。c3c2fc2c1.objfc3
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)