在这种情况下,我可以避免使用身体的纯虚函数吗

Posted

技术标签:

【中文标题】在这种情况下,我可以避免使用身体的纯虚函数吗【英文标题】:Can I avoid a pure virtual function with a body in this case 【发布时间】:2018-05-14 20:07:07 【问题描述】:

读完这篇Use-cases of pure virtual functions with body? 的帖子后,我的印象是可以避免使用带有主体的纯虚函数,但是在这种情况下我不知道该怎么做:

我有一个抽象基类,我将其称为“父类”和一个派生类的集合,我将其称为“child1”、“child2”等。我还有另一个类,称为“list”它包含一个父指针数组,可以设置为指向各种子集合的实例。例如,列表实例的数组字段可能包含指向 2 个 child1 和 1 个 child2 的指针。

删除列表实例时,我想释放 child1 和 child2 的各种实例,因此我需要 child1、child2 等的析构函数。此外,这需要我有一个抽象父类的析构函数。

再一次,上面的链接说服了我,我可以找到一种不这样做的方法,或者可能的是,我的问题考虑得不好,因为我发现自己需要这样做。

如果堆栈溢出是这个问题的错误堆栈交换,请告诉我,我会移动它。

感谢您的帮助 PS:这里有一些代码:

#include <iostream>
#define arlen 10

class parent
  public:
  virtual ~parent();
  void somefunction();
;

parent::~parent()

class child1: public parent
  public:
  ~child1();
  void somefunction();
;

child1::~child1()


class child2: public parent
  public:
  ~child2();
  void somefunction();
;

child2::~child2()

class list
  public:
  parent* ar[arlen];
  ~list()
    for (int n=0; n<arlen; n++) delete ar[n];
  


int main()

【问题讨论】:

您能向我们展示一下您到目前为止所写的尝试吗? 请展示您的代码而不是描述它。最好是minimal reproducible example。 嗯,您发布的链接说纯虚拟析构函数需要一个主体。 当然,来点伪代码怎么样,我会等几分钟 @fred 不,不是伪代码。 【参考方案1】:

在我看来,您真正需要的只是 parentvirtual 析构函数。

使用虚拟 dtor,通过 parent 指针删除编译器将正确调用派生类的析构函数。

这就是你真正需要的,我正确理解了你的问题,然后添加

 virtual ~parent() = default;

你的基类应该可以解决问题。

【讨论】:

这样做会使类抽象吗? @NeilButterworth 我希望不是,为什么要这样? @Neil Butterworth - 你很清楚;不,但是 OP 确实说“我有一个抽象基类 ...”,所以我假设该类中还有其他纯虚拟成员函数,将其呈现为抽象。 是的,基类肯定是抽象的,里面还有其他的虚函数 @fred 在抽象类中具有主体的虚拟方法没有任何问题。一种纯虚方法足以呈现类抽象。我对 OO 理论知之甚少,所以可能有些布道者有不同的看法,但谁在乎呢? :P

以上是关于在这种情况下,我可以避免使用身体的纯虚函数吗的主要内容,如果未能解决你的问题,请参考以下文章

继承的纯虚函数

带有实现的纯虚函数

C++中的纯虚析构函数

覆盖虚函数而不是纯虚函数?

C++的纯虚函数实现和头文件

c++中的纯虚函数机制如何从DLL中暴露函数