不允许继承成员,为什么
Inherited member is not allowed, why?
基本问题归结为:
// 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++机制的问题,以及为什么允许或不允许做某事
不能在类定义之外声明成员函数。 要为类定义的任何方法(无论是重写还是相对于基类隐藏)都必须在类定义中声明。
class Adder : public Calculator { };
定义派生自计算器但不提供其他功能的类。 此外,您可能还打算使计算器::计算方法成为虚拟方法。 您当前(编辑:OP 编辑了使 calculate() 虚拟的问题)隐藏了基类方法,而不是覆盖它。 如果您要处理在运行时实际上可能是 Adder 对象的计算器对象,这是有区别的。
你不能这样做,因为你没有明确说 Adder 有一个计算方法 - C++对此很严格。 如果您随后在单独的源文件中编写计算器::计算,会发生什么?
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么成员函数内的"this"指针为空?
- 为什么成员函数地址离自由函数这么远?
- 为什么成员函数调用"ambiguous"?
- 为什么成员函数指针的类型基于函数实际声明的类
- 为什么成员函数在声明之前可以被调用
- 为什么成员函数的重载解析排除全局函数
- 为什么成员变量会更改,但在这种情况下对象的地址保持不变?
- 为什么成员检测器回退必须是int
- C++:为什么成员函数优先于全局函数
- 为什么C++成员函数使用 & in 参数?
- 为什么成员初始值设定项不能使用括号?
- 为什么成员模板方法必须在类外使用模板<>专门化
- 为什么成员函数指针需要 & 而不是普通函数指针?
- 为什么成员函数的const版本总是被选中,即使存在非const版本
- 为什么成员函数尝试块处理程序中的 lambda(捕获"this")无法访问 VC++ 2013 中的私有数据成员?
- 为什么成员职能是这样处理的
- 为什么成员变量没有被修改到函数?
- 为什么成员函数指针不同于C++中的普通函数指针