繁体   English   中英

具有未重写的纯虚拟析构函数的类是否可以初始化?

[英]Should a class with an un-overridden pure virtual destructor be initializable?

普遍的看法是,如果您可以通过使用纯虚拟析构函数来使类抽象化。

引用赫伯·萨特

所有基类都应具有虚拟析构函数(有关原因,请参阅您最喜欢的C ++书)。 如果该类应该是抽象的(您想防止实例化),但是它没有碰巧具有任何其他纯虚函数,那么一种使析构函数成为纯虚函数的通用技术是:

但是下面的代码为我使用GCCVC进行编译:

#include <iostream>

struct base {
    virtual ~base() = 0;
};

base::~base() { std::cout << "base destructor\n"; }

struct derived : base { };

int main() {
    derived d;
}

我不知道在C ++ 11中有什么变化吗?

顺便说一下,这个问题的动机是我五年前给出答案 ,突然被评论员挑战了。

derived类具有一个隐式定义的(由编译器提供)虚拟析构函数,该虚构析构函数不是纯虚拟的,它会覆盖基本析构函数。 因此, derived的不是抽象类。 可以实例化。

这与C ++ 11无关。 自C ++ 98以来就是这样。 使基类析构函数纯为虚拟是一种使它成为抽象类的方法。 派生类中由编译器提供的析构函数将是非纯虚拟的,它将自动“抵消”那些类中的抽象性(假设没有其他纯虚拟方法从基类继承)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM