关于继承和覆盖的问题
Posted
技术标签:
【中文标题】关于继承和覆盖的问题【英文标题】:Questions on Inheritance and Overriding 【发布时间】:2017-07-15 23:34:07 【问题描述】:我目前有一个软件使用两个在各方面都相同的类,它们有大约 25 个相同的数据成员,并且有一个函数来进行计算以填充这些数据成员。两者的区别在于计算功能。每个类执行不同的计算来填充这 25 个私有数据成员。
所以我所做的是创建一个具有 25 个数据成员的基类,并在此处创建所有 getter/setter 方法,然后,创建两个继承此基类的新类,并为每个新类创建一个计算函数继承基类的类。进行计算的函数在两个子类之间具有相同的名称,但在每个子类中执行的操作不同。我的问题是,有没有一种方法可以将计算函数包含在它们继承的基类中,并在每个子类中定义它们不同?我对压倒一切还是很陌生,但这会是一个这样做的地方吗?如果是这样,我该怎么做呢?我意识到这不是什么大不了的事,我只是在重复自己,但我想尽可能保持干燥。
【问题讨论】:
你在后续派生类中重写了一个基类虚函数。 【参考方案1】:听起来你只是想在你的基类中添加一个纯虚函数。像这样的:
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;
;
基类中的= 0
将set_field
声明为纯虚函数,这意味着在base
中没有实现的函数。因为base
有一个或多个纯虚函数,它是一个纯虚类——你永远不能创建base
类型的对象,只能创建子类型。
然而,继承给您的是,您可以对基类(甚至是纯虚拟类)的指针或引用进行操作,而无需知道派生类型是什么。这意味着您可以编写一个函数void f(base &)
来调用set_field
,并且您可以在typeA
或typeB
的对象上调用f
。
【讨论】:
太棒了!我认为这一切都是有道理的,除了几件事。您愿意详细说明为什么纯虚拟需要 a =0;在末尾?这有点令人困惑,这是否意味着该功能实际上是缺失的,因为它只是一个虚拟的?此外,关于使用基 * 的评论,您能否扩展如何使用它而不是通过类型 A 或 B?我想我只是在那里混合了一些东西。 @joe_04_04 我在答案中澄清了这一点。 非常感谢!这下全说通了! :) 那么,既然我的基类已经定义了setter/getter,它就不能是一个纯虚类吗?我尝试将calculate
函数设为纯虚函数,但随后编译器抱怨该类没有纯虚析构函数,在我给它一个纯虚导师之后,它又抱怨基类不是纯虚函数,但后来我意识到我已经定义了 setter / getter 方法,所以我假设我不能向它添加纯虚函数?以上是关于关于继承和覆盖的问题的主要内容,如果未能解决你的问题,请参考以下文章