关于继承和覆盖的问题

Questions on Inheritance and Overriding

本文关键字:覆盖 问题 继承 于继承      更新时间:2023-10-16

我目前有一个软件,它使用两个在各个方面都相同的类,它们具有相同的 25 个左右的数据成员,并且有一个函数可以进行计算以填充这些数据成员。 两者的区别在于计算函数。 每个类执行不同的计算来填充这 25 个私有数据成员。

所以我所做的是创建一个具有 25 个数据成员的基类,并在此处创建了所有 getter/setter 方法,然后创建了两个继承此基类的新类,并且为每个继承基类的新类创建了一个计算函数。 执行计算的函数在两个子类之间具有相同的名称,但在每个子类中执行不同的操作。 我的问题是,有没有办法将该计算函数包含在它们继承的基类中,并在每个子类中定义不同的它们? 我对覆盖仍然很陌生,但这是一个可以做到这一点的地方吗?如果是这样,我该怎么做呢? 我意识到这没什么大不了的,我只是勉强重复自己,但我想让事情尽可能干燥。

听起来你只是想要一个基类中的纯虚函数。 像这样:

struct base {
int field;
virtual void set_field(int) = 0;
};
struct typeA : base {
void set_field(int val) override { field = /* some function of */ val; }
};
struct typeB : base {
void set_field(int val) override { field = /* some function of */ val; }
};

基类中的= 0set_field声明为纯虚函数,这意味着在base中没有实现的函数。 因为base有一个或多个纯虚函数,所以它是一个纯虚类——你永远不能创建base类型的对象,只能创建子类型的对象。

但是,继承为您提供的是,您可以对指向基类(甚至是纯虚拟类)的指针或引用进行操作,而无需知道派生类型是什么。 这意味着您可以编写一个调用set_field的函数void f(base &),并且可以在typeAtypeB的对象上调用f