2011-01-09 123 views
0
class OGraph { 
public: 
    OGraph() { } 
    virtual ~OGraph(); 

    virtual bool is_directed()=0; 
}; 

class OUGraph : public OGraph { 
public: 
    OUGraph() { } 
    bool is_directed() { return false; } 
    ~OUGraph() {} 
}; 

但是當我做這個問題繼承

OUGraph myGraph(); 
cout << myGraph.is_directed(); 

我收到以下錯誤:

Undefined symbols: "typeinfo for OGraph", referenced from: typeinfo for OUGraphin main.o "vtable for OGraph", referenced from: OGraph::OGraph()in main.o mkdir -p dist/Debug/GNU-MacOSX "OGraph::~OGraph()", referenced from: g++ -o dist/Debug/GNU-MacOSX/opengraph build/Debug/GNU-MacOSX/OGraph.o build/Debug/GNU-MacOSX/main.o
OUGraph::~OUGraph()in main.o OUGraph::~OUGraph()in main.o ld: symbol(s) not found collect2: ld returned 1 exit status make[2]: * [dist/Debug/GNU-MacOSX/opengraph] Error 1 make[1]: [.build-conf] Error 2 make: ** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 568ms)

回答

1

你沒有提供virtual ~OGraph();實施。要麼提供一個實現,將其指定爲純虛擬的= 0;,或者只是擺脫它。

編譯器希望將該類的類型信息附加到其第一個虛擬方法的實現。你的第一個虛擬方法是未定義的,所以實現永遠不會生成,並且你會得到相關的鏈接錯誤。

此外,大家都在說,你應該從myGraph的定義中刪除括號。

4

此:

OUGraph myGraph(); 

正在申報一個函數調用myGraph那返回OUGraph。你需要,而不是有:

OUGraph myGraph; 

聲明一個變量,你打算。

+0

對不起,我粘貼了錯誤的代碼。我剛剛更新了它,並收到了錯誤消息。 – Bob 2011-01-09 03:08:40

2

這是所有新的C++人都會遇到的舊事情。

OUGraph myGraph(); 

您還沒有創建了一個名爲myGraph變量,你聲明一個函數調用myGraph返回一個OUGraph。去除 」()」。

你也顯然從來沒有在任何地方定義你的基地的析構函數。即使它是空的,你需要定義它,因爲你已經在你的類定義中聲明瞭它。

0

如果你正在構建一個基於'默認'構造函數的新對象,我相信你會在沒有空括號的情況下調用它。

所以,你可以使用OUGraph myGraph沒有OUGraph myGraph()