2016-12-04 84 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>();