0

编辑:正如 DyP 在下面的评论中指出的那样,这只是 c3(SoccerWorld) 中函数定义中的一个错字。

  • 我有一个类,比如说c1,它有一个虚函数,f
  • 另一个类c2继承自c1,另一个c3继承自c2
  • c2没有虚拟功能f,但我想c3通过一些更改添加它。
  • 中的虚函数不是纯函数f,而是在. 我仍然需要在,以及。c1c1.cppfc1

添加fc3和 notc2时,我得到一个未解决的外部符号错误。如果我也将fto添加c2为虚拟函数,则会收到两个错误:一个与以前相同,c1.obj另一个fc3.

这就是c1, c2,c3的样子:

class C1 {
   virtual void f() { ... }
};

class C2 : public C1 {
   //No virtual f
};

class C3 : public C2 {
   virtual void f() { /*Do something*/ }
};

实 f 函数:

AbstractKart *World::createKart(const std::string &kart_ident, int index, int local_player_id, int global_player_id, RaceManager::KartType kart_type)
{ ... }

这是在课堂上的世界。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)
4

2 回答 2

3

从评论转贴到 OP:

从你的错误猜测,我认为你宁愿有一个错字。看起来soccer_world.cpp,您定义了一个函数AbstractKart *World::createKart(...)而不是AbstractKart *SoccerWorld::createKart(...).

这创建了 的第二个定义AbstractKart *World::createKart(...),它解释了第一个错误:

world.obj : error LNK2005: " protected: virtual class AbstractKart * __thiscall World::createKart([...])" [...]已经在soccer_world.obj 中定义

如果您尝试调用 not-defined ,则会发生第二个错误AbstractKart *SoccerWorld::createKart(...)

Football_world.obj:错误 LNK2001:未解析的外部符号“ protected: virtual class AbstractKart * __thiscall SoccerWorld::createKart([...])” [...]

于 2013-07-21T19:10:00.667 回答
1

您总是可以在 C2 类中定义 f() :

class C2 : public C1 {

     virtual void f() { C1::f(); }

};

这将允许 C2 像 C3 从未存在一样运行。

于 2013-07-21T18:23:50.183 回答