2016-12-04 136 views
0

我試圖實現從分類算法的純法一類BasicAlgo這樣的:未實現純虛方法

class Algorithm 
{ 
    public: 
     virtual void solve() = 0; 
}; 

class BasicAlgo : public Algorithm 
{ 
    public: 
     void solve() { }; 
}; 

Algorithm a = BasicAlgo(); 
a.solve(); 

但我發現了這個錯誤:

variable type 'Algorithm' is an abstract class 
    Algorithm a = BasicAlgo(); 
      ^
unimplemented pure virtual method 'solve' in 'Algorithm' 
      virtual void solve() = 0; 

後大量的時間在Stackoverflow尋找解決方案,我仍然不明白爲什麼會有錯誤。對我來說a.solve()BasicAlgo::solve女巫實施得很好。

回答

5

C++不是Java。

Algorithm a = BasicAlgo(); 

上述嘗試通過拷貝來定義一個對象類型AlgorithmBasicAlgo對其進行初始化。即使它正常工作(在這種情況下,由於純虛函數禁止實例化對象),您只需要將sliceBasicAlgo對象轉換爲Algorithm即可。

你的目的,你需要一個指針或引用,就像這樣:

std::unique_ptr<Algorithm> a = std::make_unique<BasicAlgo>(); 
a->solve(); 
+0

謝謝!你是對的我正在嘗試寫Java ... –

+0

@GuillaumeWuip,不客氣。我建議你儘量把你的Java知識放在一邊,以新手程序員的方式來處理C++。它們共享一些關鍵字,都是「大括號」語言,但這就是相似性結束的地方。他們處理完全不同的成語。 – StoryTeller

+0

這就是我的老師也在講的。有時候很難。 C++有很多這種非常強大的功能 –

2

Algorithm a = BasicAlgo();不允許多態行爲 - 事實上,如果類是不是抽象的,你會遇到slicing

您可以使用std::unique_ptr允許繼承多態性:

std::unique_ptr<Algorithm> a = std::make_unique<BasicAlgo>();