【问题标题】:How to properly override virtual functions in derived classes (c++)如何正确覆盖派生类中的虚函数(C++)
【发布时间】: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

感谢任何形式的帮助!几天来,我一直在尝试解决此错误,但无济于事!我什至尝试过在线搜索,但它们都显示了人们覆盖其虚拟功能的示例。我做错什么了吗?我看不出它和其他人有什么不同。谢谢!

【问题讨论】:

  • SpellBookShopSwordShop 应该有虚拟析构函数...

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


【解决方案1】:

您需要告诉编译器您正在实现哪个 EnterShop 函数。您可以通过在其前面加上类名来做到这一点,如下所示:

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

【讨论】:

  • 哇,我不敢相信像这样简单的事情就是答案!嗯,一部分。它仍然不起作用,但后来我添加了“virtual void EnterShop(Hero &hero) override;”在标题中,它起作用了!谢谢!
猜你喜欢
  • 2018-12-23
  • 2014-02-06
  • 2021-10-22
  • 2023-03-09
  • 1970-01-01
  • 2019-08-31
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多