我需要设置一个类继承结构,其中抽象基类只保存成员变量(但没有成员方法)。成员方法将由派生类定义。因此,我需要的是这篇文章:Making a class abstract without any pure virtual methods
从那里的前两个答案,我意识到有两种方法可以实现它:
我很想知道这两种方法之间的区别。是否存在一个应该优先于另一个的情况(或者某些特殊情况,其中一个可以工作而不是另一个)?我想到了,无法想到任何事情。
我在这里搜索了一些帖子(Is there a use for making a protected destructor virtual?,C++: Protected Class Constructor,Should an abstract class' destructor be pure virtual?)的答案,试图将某些内容放在一起,但我无法得出结论。
答案 0 :(得分:3)
通过利用完全不同的机制,两种方式都能达到预期的效果。在我看来,protected constructor
更具表现力,因为它与您的问题描述完全一致。 Pure virtual destructor
不是一个自然的解决方案,可能需要额外的文档来解释其目的。它也会强制子类实现析构函数,即使它可以被跳过。
答案 1 :(得分:3)
主要区别在于
Base * ptr = new Derived;
delete ptr;
使用虚拟析构函数是合法的,没有它就会有UB。此外dynamic_cast
至少需要一个虚函数
因此,如果您想要多态行为,请使用(纯)虚拟析构函数。如果您不想要它,请使用受保护的构造函数,并且不要为多态性(vtables)支付开销。但是然后声明析构函数也受到保护,以防止通过基指针删除。