我对C和Java非常有信心并且刚刚开始使用C ++,仍然习惯了有关最佳实践的基础知识,包括数据抽象(据我所知,这意味着正确的标头使用)。
我想制作一个解决不同类型问题的项目,这些问题都意味着从文件中读取数据,解决问题并将结果写入新文件,所以我想我会使用类似于<的东西Java中的strong> interface 。
我的标题如下:
#include <iostream>
using namespace std;
class Problem {
public:
/*
* Read data from file.
*/
virtual bool read(string filename) = 0;
/*
* Solve problem.
*/
virtual void solve() = 0;
/*
* Write solution to file.
*/
virtual bool write(string filename) = 0;
};
class Brothers : public Problem {};
我正在尝试在我的Brothers.cpp
源文件中实现第一个函数,如下所示:
bool Brothers::read(string filename) override {...}
除Brothers::
部分外,如果我只有源文件,我通常会实现此功能。
我收到了错误Function 'read' was not declared in class 'Brothers'
和Function doesn't override any base member functions
,我想了解为什么这种方法不起作用以及我应该做些什么。
答案 0 :(得分:0)
即使你重写了基类声明,与java不同,你仍然需要在派生类的头文件中声明该函数。编译器只查找与该函数关联的类,因此当您说read
中有一个函数Brother
并且它无法看到明确存在一个函数时,您会收到错误。
另一件事是当你使用接口或其他抽象类时,必须在有一个非纯虚拟的类之前定义声明为纯虚拟的所有东西,所以在这个例子中:
class A
{
virtual void foo() = 0;
}
class B : public A
{
virtual int bar()
{
return 0;
}
}
class C : public B
{
virtual void foo()
{
// Do something
}
}
类A
是抽象的,因为它具有纯虚函数,但B
也是如此,因为它仍然没有foo()
的定义。在有定义之前,不能有非抽象类。