【问题标题】:Inherited member is not allowed, why? [duplicate]不允许继承成员,为什么? [复制]
【发布时间】:2014-01-04 00:24:27
【问题描述】:

基本问题归结为:

// 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++ 机制的问题,以及为什么允许或不允许做某事

【问题讨论】:

标签: c++ class inheritance


【解决方案1】:

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

class Adder : public Calculator { };

定义一个派生自 Calculator 的类,但不提供其他功能。此外,您可能打算将 Calculator::calculate 方法设为虚拟。您当前(编辑:OP 编辑​​了计算计算()虚拟的问题)隐藏基类方法,而不是覆盖它。如果您要处理在运行时实际上可能是 Adder 对象的 Calculator 对象,这会有所不同。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 然后将主体添加到主类,而不是派生类......派生类的成员仍将按预期工作......理想情况下是
    • 那么你会遇到在一个单独的源文件中编译代码会改变这个文件的含义的情况。请记住,您可以在 Calculate 和 Adder 中执行不同的计算(这并不是一个好主意)。
    • 但重点是他们会做不同的事情,我可以添加一个 Multiplier 类,它也将使用计算方法,但它不应该返回 a + b,它应该返回 a * b而是
    • 我的意思是完全不同的——做一些其他不相关的计算——在你的情况下会(或不会)被调用,这取决于完全不同的源文件。
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2013-04-23
    • 2013-10-23
    • 2016-12-12
    • 2011-01-02
    • 2010-12-06
    • 2011-11-01
    相关资源
    最近更新 更多