【发布时间】:2014-01-15 15:30:50
【问题描述】:
好的,我有一个简单的英雄类,我将它传递给我的 MainShop 类。问题是我想知道如何让这些虚拟功能工作。我在我的“基”类 MainShop 中声明了一个纯虚函数,并且我的所有派生类都继承自它,但是每次我在多个派生类中重写虚函数时,我都会收到一个链接器错误,说我有多个符号已定义。
基类:
//MainShop.h
#ifndef __SampleClass1__MainShop__
#define __SampleClass1__MainShop__
#include "Hero.h"
class MainShop
{
public:
void mainShop(Hero& hero);
virtual ~MainShop(){} // Doesn't do anything, but you need it anyway
virtual void EnterShop(Hero &hero)=0;//abstract
};
#endif /* defined(__SampleClass1__MainShop__) */
//MainShop.cpp
#include "MainShop.h"
void MainShop::mainShop(Hero& hero)
{
//Some code here
EnterShop(hero);//virtual function
}
派生类:
//SwordShop.h
#ifndef __SampleClass1__SwordShop__
#define __SampleClass1__SwordShop__
#include "MainShop.h"
class SwordShop: public MainShop
{
public:
void soldierShop(Hero& hero);
};
#endif /* defined(__SampleClass1__SwordShop__) */
//SwordShop.cpp
#include "SwordShop.h"
void soldierShop(hero)
{
//Some code here
}
void EnterShop(Hero& hero)
{
//I WANT TO BE ABLE TO CALL soldierShop FROM WITHIN THIS EnterShop() FUNCTION
cout << "Inside swordshop";//Debug Purposes
//SwordShop Sword;
//Sword.soldierShop(hero);
//MainShop *swordShop = &Sword;
// calling soldierShop
//swordShop->EnterShop(hero);
}
//SpellBookShop.h
#ifndef __SampleClass1__SpellBookShop__
#define __SampleClass1__SpellBookShop__
#include "MainShop.h"
class SpellBookShop: public MainShop
{
public:
void MageShop(Hero& hero);
};
#endif /* defined(__SampleClass1__SpellBookShop__) */
//SpellBookShop.cpp
#include "SpellBookShop.h"
void SpellBookShop::MageShop(Hero& hero)
{
//Some Code Here
}
void EnterShop(Hero& hero)//trying to override virtual function
{
//I WANT TO BE ABLE TO CALL MageShop FROM WITHIN THIS EnterShop() FUNCTION
cout << "Inside Spell Shop\n";//Debug Purposes
}
除了 SwordShop 和 SpellBookShop,我还有另外两个类,它们是 BowShop 和 PotionShop,每个类都分为它们的 .h 和 .cpp 文件,但我没有包括它们,因为它们与这两个类完全相同,所以它是多余的。
当我调试时,我尝试注释掉我试图覆盖的每个虚拟功能,我发现我只能覆盖一个。如果我尝试覆盖另一个,它会给我这个错误。例如:在 SwordShop.cpp 我可以这样做:
void EnterShop(Hero& hero)
{
cout << "Inside swordshop";//Debug Purposes
}
但如果我尝试在 BowShop 或 SpellBookShop 中也这样做,它会给我这个错误。
如果你们想看到错误,这里是:
Duplicate symbol __Z9EnterShopR4Hero in:
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/PotionShop.o
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/SpellBookShop.o
duplicate symbol __Z9EnterShopR4Hero in:
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/PotionShop.o
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/SwordShop.o
duplicate symbol __Z9EnterShopR4Hero in:
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/PotionShop.o
/Users/Damian/Library/Developer/Xcode/DerivedData/SampleClass1-dmwbviaemubkqddiigadavsgeknm/Build/Intermediates/SampleClass1.build/Debug/SampleClass1.build/Objects-normal/x86_64/BowShop.o
ld: 3 duplicate symbols for architecture x86_64
感谢任何形式的帮助!几天来,我一直在尝试解决此错误,但无济于事!我什至尝试过在线搜索,但它们都显示了人们覆盖其虚拟功能的示例。我做错什么了吗?我看不出它和其他人有什么不同。谢谢!
【问题讨论】:
-
SpellBookShop和SwordShop应该有虚拟析构函数...
标签: oop inheritance polymorphism abstract-class virtual-functions