简单程序中的虚拟析构函数导致编译器错误:“未解析的外部符号”

时间:2014-05-29 20:23:21

标签: c++ inheritance polymorphism virtual destructor

我的C ++中的简单数据库程序存在问题(具有继承和虚拟功能。) 我做过类hirarchy,代表对象Weapon:

#ifndef Ammu_h
#define Ammu_h

#include <string>
#include <iostream>
using namespace std;

//////////HEADER FILE//////////////
class Weapon{                               
protected:                                      
    string name;
    char damage;

public: 
    virtual void show() = 0;
    //virtual ~Weapon();        
};

class WhiteArm: public Weapon{
protected:
    double sharpness;
    double defence;

};

class Axe: public WhiteArm{
public:
    Axe(string str, char dmg, double shrp, double def){
        name = str;
        damage = dmg;
        sharpness = shrp;
        defence = def;
    };
    void show(){
        cout << this->name << this->damage << this->sharpness << this->defence << endl;
    };

//class Sword: public WhiteArm{...};
//class Club: public WhiteArm{...};

};

#endif

首先,我不太确定我的实施是否合适。

  1. 我的主要问题是,当我添加虚拟析构函数时,我收到错误:LNK2001: unresolved external symbol "public: __thiscall Weapon::~Weapon(void)" 我认为有必要在基类包含虚方法时使析构函数成为虚拟。

  2. 在层次结构的末尾构建构造函数是否合适? (像我一样,上层)

  3. 我将感谢对我的代码的每一个建议 提前致谢

1 个答案:

答案 0 :(得分:3)

你的虚拟析构函数仍然需要有一个实现,即使你的意思是它是纯虚拟的。我通常使用这种奇怪的语法来编写它们:virtual ~Weapon() = 0 {}

但是,显然这对某些编译器(微软以外的所有编译器都不起作用)都不起作用,这是正确的(C ++ 11draft§10.4/ 2):

  

[注意:函数声明不能​​同时提供纯指定符   和定义 - 结束注释] [例如:

 struct C
 {
    virtual void f() = 0 { }; // ill-formed
 };

相反,您可以省略= 0或在课程定义之外找到正文。