基本问题归结为:
// header
class Calculator
{
public:
virtual int calculate(int a, int b);
};
class Adder : public Calculator
{
};
// class file
int Adder::calculate(int a, int b) {return a + b;} // gives error
为什么我不被允许这样做?
我会假设,因为Adder
继承了Calculator
的成员,我可以将它们的身体定义为它们自己的身体,但显然这是不可能的......
我已经看到了其他答案,他们只需要在子类中再次编写成员定义,但对我来说似乎浪费了很多代码行,反复重复相同的文本,所以这个问题是...
如果不在子类的定义中覆盖它,为什么我不能这样做?
另外,请注意,这不是关于如何修复错误的问题,这是关于C ++的机制以及为什么允许或不允许执行某些操作的问题
答案 0 :(得分:3)
您不能在类定义之外声明成员函数。您要为类定义的任何方法(无论是覆盖还是隐藏相对于基类)都必须在类定义中声明。
class Adder : public Calculator { };
定义从Calculator派生的类,但不提供其他功能。你也可能想让Calculator :: calculate方法变得虚拟。您当前(编辑:OP编辑了使计算()虚拟的问题隐藏了基类方法,而不是覆盖它。如果您打算在运行时处理可能实际上是Adder对象的Calculator对象,那将会有所不同。
答案 1 :(得分:2)
你不能这样做是因为你没有明确表示Adder有一个计算方法 - 而且C ++对它很严格。如果您在单独的源文件中编写Calculator :: calculate会发生什么?