2013-05-05 5 views
0

Привет я получаю следующие ошибки:Нерешенные Экстерналии при использовании полиморфизма

Error 9 error LNK1120: 2 unresolved externals 

Error 8 error LNK2019: unresolved external symbol "public: virtual __thiscall physics::~physics(void)" ([email protected]@[email protected]) referenced in function "public: virtual void * __thiscall physics::`scalar deleting destructor'(unsigned int)" ([email protected]@[email protected]) 

Error 7 error LNK2019: unresolved external symbol "public: virtual __thiscall student::~student(void)" ([email protected]@[email protected]) referenced in function [email protected]@[email protected]$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); 
     } 
    } 

}; 

выше компилируется нормально, но когда я пытаюсь инициализировать объект в основной() с помощью:

int main(){ 

    //Database Storage 
    vector<student*> DB; 
    DB.push_back(new physics); 
} 

Вот когда я получаю ошибки (удаление push_back линии фиксирует ее, но мне это нужно для моей программы). Что я делаю не так?

+0

Выключает добавление фигурных скобок к концу деструкторов. Какая разница? ~ student() {}; вместо ~ student(); – Edd

+0

Точка с запятой после '~ student() {}' не является незаконной, но она не нужна и не имеет смысла. Вы не ставите его после определения других встроенных функций. –

ответ

2

Выключает добавление фигурных скобок к концу деструкторов. Какая разница? (от комментариев)

Разница заключается в том, что в одном случае у вас есть декларацию, которая испытывает недостаток в определение; во втором случае вы предоставляете (пустое) определение inline.

Попытки вызвать функцию, которая объявлена, но не определена (как в первом случае) привести в ошибке нерешенных опорной поднятой линкера - в конце концов, что он должен делать, когда вызов функции найден для функция, реализация которой недоступна?