2010-12-06 133 views
5

我有一個類的設置,並從那個類我使用繼承。C++無法解析的外部符號

在文件啊

class a 
{ 
public: 
    virtual void print(); 
}; 

在文件BH:

#include "a.h" 
#include <iostream> 
class b: public a 
{ 
public: 
    void print(); 
}; 

而且在b.cpp

#include "a.h" 
#include "b.h" 
void b::print(){}; 

在主文件我包括這兩個文件:

#include "a.h" 
#include "b.h" 

然而,我得到了虛擬功能打印的未解決符號。文件a.obj被列爲產生錯誤的文件我做錯了什麼?如果我將b.cpp移入類定義下的b.h,它可以正常工作。

回答

9

你有一個b :: print的實現,但不是一個:: print。如果實例化類a的一個對象並在其上調用print(),會發生什麼?即

a o; 
o.print(); 

b :: print覆蓋a :: print,但仍然需要執行a :: print(除非使其爲純虛擬)。

進行打印純虛擬,其定義是這樣的:

virtual void print() = 0; 

當一個類有純虛函數,你不能實例化類的對象。您必須從該類派生出來,並在您擁有可實際實例化的類之前提供任何純虛函數的實現。

+0

我猜的到底需要一個分號,這是它,即使在OP並沒有真正提供足夠的信息來確定。 – 2010-12-06 02:39:18

+0

純虛是什麼意思? – 2010-12-06 02:39:23

1

它可能是一個拼寫錯誤,但在b.cpp中,您已經在名爲Add的類中實現了print()函數,而不是b類。

0

我想你在類接口