不允许继承的成员,为什么?

时间:2014-01-04 00:24:28

标签: c++ class inheritance

基本问题归结为:

// 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 ++的机制以及为什么允许或不允许执行某些操作的问题

2 个答案:

答案 0 :(得分:3)

您不能在类定义之外声明成员函数。您要为类定义的任何方法(无论是覆盖还是隐藏相对于基类)都必须在类定义中声明。

class Adder : public Calculator { };

定义从Calculator派生的类,但不提供其他功能。你也可能想让Calculator :: calculate方法变得虚拟。您当前(编辑:OP编辑了使计算()虚拟的问题隐藏了基类方法,而不是覆盖它。如果您打算在运行时处理可能实际上是Adder对象的Calculator对象,那将会有所不同。

答案 1 :(得分:2)

你不能这样做是因为你没有明确表示Adder有一个计算方法 - 而且C ++对它很严格。如果您在单独的源文件中编写Calculator :: calculate会发生什么?