如何正确覆盖派生类中的虚函数(c ++)

时间:2013-12-28 04:04:20

标签: oop inheritance polymorphism abstract-class virtual-functions

好的,我有一个简单的英雄课,我将其传递到我的MainShop课程中。问题是我想知道如何使这些虚拟功能工作。我在我的“Base”类中声明了一个纯虚函数,它是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

感谢任何形式的帮助!我一直试图解决这个错误几天,但无济于事!我甚至尝试在线搜索,但他们都展示了人们覆盖虚拟功能的例子。我做错了吗?我不知道它与其他人有何不同。谢谢!

1 个答案:

答案 0 :(得分:1)

您需要告诉编译器您正在实现哪个EnterShop功能。您可以通过在其前面加上类名称来实现,如:

void SwordShop::EnterShop(Hero& hero)
{
    cout << "Inside swordshop";//Debug Purposes
}