C++ 使用多态性时未解析的外部

C++ 使用多态性时未解析的外部,c++,vector,polymorphism,unresolved-external,C++,Vector,Polymorphism,Unresolved External,您好,我收到以下错误: Error 9 error LNK1120: 2 unresolved externals Error 8 error LNK2019: unresolved external symbol "public: virtual __thiscall physics::~physics(void)" (??1physics@@UAE@XZ) referenced in function "public: virtual void * __thiscall physics::

您好,我收到以下错误:

Error 9 error LNK1120: 2 unresolved externals

Error 8 error LNK2019: unresolved external symbol "public: virtual __thiscall physics::~physics(void)" (??1physics@@UAE@XZ) referenced in function "public: virtual void * __thiscall physics::`scalar deleting destructor'(unsigned int)" (??_Gphysics@@UAEPAXI@Z)

Error 7 error LNK2019: unresolved external symbol "public: virtual __thiscall student::~student(void)" (??1student@@UAE@XZ) referenced in function __unwindfunclet$??0physics@@QAE@XZ$0
使用以下代码执行以下操作:

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



class student{
protected:
    string fName,sName;
    int id;
    vector<string> cname;
    vector<int> cmark;
public:
    virtual ~student();
    virtual void addCourse(string name, int mark)=0;
};


class physics : public student{
public:
    physics(){//Initialize default values
        fName="blank";
        sName="blank";
        id=0;
        cname.push_back("none");
        cmark.push_back(0);
    };
    ~physics();

    void addCourse(string name, int mark){
        if(cname.size()==1){//override default value for a size of 1
            cname[0]=name;
            cmark[0]=mark;
        }
        else{
            cname.push_back(name);
            cmark.push_back(mark);
        }
    }

};
#包括
#包括
#包括
使用名称空间std;
班级学生{
受保护的:
字符串fName,sName;
int-id;
向量cname;
向量标记;
公众:
虚拟~student();
虚拟void addCourse(字符串名称,整数标记)=0;
};
班级物理:公共学生{
公众:
物理(){//初始化默认值
fName=“blank”;
sName=“blank”;
id=0;
cname.推回(“无”);
c标记。推回(0);
};
~physics();
void addCourse(字符串名称,整数标记){
如果(cname.size()==1){//覆盖大小为1的默认值
cname[0]=名称;
cmark[0]=标记;
}
否则{
cname.push_back(名称);
C标记。推回(标记);
}
}
};
上面的编译很好,但当我尝试使用以下命令初始化main()中的对象时:

int main(){

    //Database Storage
    vector<student*> DB;
    DB.push_back(new physics);
}
intmain(){
//数据库存储
矢量分贝;
DB.推回(新物理学);
}
这就是我得到错误的时候(删除push_back行可以修复它,但我的程序需要它)。我做错了什么


结果是在析构函数的末尾添加大括号修复了它。这有什么区别?(摘自评论)

区别在于,在一种情况下,您有一个缺少定义的声明;在第二种情况下,您提供了一个内联(空)定义


尝试调用已声明但未定义的函数(如第一种情况)会导致链接器引发未解决的引用错误-毕竟,当为其实现不可用的函数找到函数调用时,它应该怎么做

结果是在析构函数的末尾添加大括号修复了它。这有什么区别~学生(){};而不是~student();
~student(){}
后面的分号不是非法的,但它是不必要的,也没有意义。您也不会将它放在其他内联函数定义之后。