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

C++ 不允许继承成员,为什么?,c++,class,inheritance,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的成

基本问题归结为:

// 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++的机制的问题,以及为什么某些事情是或不允许做< /p> < p>你不能这么做,因为你没有明确地说加法器有一个计算方法,C++是严格的。如果在单独的源文件中编写Calculator::calculate,会发生什么情况?

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

class Adder : public Calculator { };

定义从计算器派生的类,但不提供其他功能。另外,您可能打算使Calculator::calculate方法虚拟化。您当前正在(编辑:OP编辑问题使calculate()虚拟)隐藏基类方法,而不是重写它。如果要处理运行时实际上可能是加法器对象的计算器对象,则会产生不同。

这样会将主体添加到主类,而不是派生类。。。派生类的成员仍将按预期工作。。。理想情况下,当您在一个单独的源文件中编译代码时,会改变该文件的含义。记住,你可以在calculate和加法器中都有一个calculate,它可以做不同的事情(这不是一个好主意)。但关键是它们可以做不同的事情,我可以添加一个乘法器类,它也可以使用calculate方法,但它不应该返回a+b,它应该返回a*b instedi,这意味着完全不同——进行一些其他无关的计算——在您的情况下,根据完全不同的源文件,会(或不会)调用这些计算。