C++ 应该是一个抽象类';析构函数是纯虚拟的吗?

C++ 应该是一个抽象类';析构函数是纯虚拟的吗?,c++,abstract-class,destructor,pure-virtual,C++,Abstract Class,Destructor,Pure Virtual,我认为光靠虚拟就足够了 除了强制派生类实现它们自己的析构函数之外,还有其他原因使其成为纯虚拟的吗?我的意思是,如果在类的构造函数中分配了某些内容,那么您应该弹劾您自己的析构函数-如果您的类是派生的还是非派生的 正如我已经知道的那样,这不算答案:如果你想要你的类抽象,而它没有纯虚函数,就让析构函数来处理吧 是否还有其他用途?否。如果基类分配了任何内容,则由它负责发布 此外,如果派生类不允许任何操作,那么强制它们编写虚拟dtor是没有意义的。如果您的抽象类是纯接口,没有数据成员,那么您可以将dtor

我认为光靠虚拟就足够了

除了强制派生类实现它们自己的析构函数之外,还有其他原因使其成为纯虚拟的吗?我的意思是,如果在类的构造函数中分配了某些内容,那么您应该弹劾您自己的析构函数-如果您的类是派生的还是非派生的

正如我已经知道的那样,这不算答案:如果你想要你的类抽象,而它没有纯虚函数,就让析构函数来处理吧


是否还有其他用途?

否。如果基类分配了任何内容,则由它负责发布


此外,如果派生类不允许任何操作,那么强制它们编写虚拟dtor是没有意义的。

如果您的抽象类是纯接口,没有数据成员,那么您可以将dtor设置为纯虚拟。我自己更喜欢这样,因为我已经看到太多的热门程序员忘记了制作虚拟析构函数:即使他们编写包含虚拟方法的派生类时也是如此。
因此,我这样做纯粹是为了尽量减少维护方面的麻烦。

理想情况下,该语言应该有一种方法来确保(隐式地或不隐式地)析构函数在抽象类中是虚拟的,而不必定义它或使它成为纯粹的。但事实并非如此

因此,我们的选择是:要么让它变得纯净,并在每个派生类中定义它,要么让它不纯净,并在抽象类中定义它。后者的工作量更少,代码也更短,所以我选择后者

如果你想让你的类抽象起来 没有纯虚拟函数-离开 把它交给析构函数

事实上,我不认为还有更多。纯虚拟析构函数所做的就是将整个类抽象化。您必须为纯虚拟析构函数以及非纯虚拟析构函数提供实现,派生类的析构函数是单独使用虚拟析构函数的虚拟析构函数,等等


基本上,如果一个类已经有一些纯虚拟函数,那么它的行为将与虚拟和纯虚拟析构函数等效。

请注意,如果派生类中没有显式提供析构函数,编译器将自动在派生类中生成析构函数。这个自动生成的析构函数就足够了,您不必自己编写析构函数,即使基类中的析构函数是纯的。好评论!请注意:另一个必须是虚拟的函数是(当存在时)运算符=。与dtor的原因相同。@rursw1:
运算符=()
对具有值语义的类很有用,但对多态类不有用。代码更短,因为纯虚拟dtor必须在类之外实现。反对纯虚拟的第一个论点!谢谢,实际上,我不认为代码会变短。比较
~Klass()=0
+它的实现和
~Klass(){}
“+它的实现”是关键,因为它不能内联,即Klass::~Klass(){}@jpalacek,我的意思是,如果析构函数在抽象类中不是纯的,那么不必在每个派生类中定义它。所以在调用链中没有额外的析构函数。而且它在派生类中的混乱程度也更小。@Fabio:即使它在基类中是纯的,也不必在每个派生类中定义它。隐式析构函数已经足够好了。忘记编写析构函数在任何类中都是一种风险,而不仅仅是在派生类中!这里最大的问题是忘记在基类中编写虚拟析构函数。我不知道为什么会有反对票?因为没有关于原因的评论。所以,如果我遗漏了什么,那就没什么帮助了。或者,如果我没有很好地表达自己(我看今天早上我可以用校对器),你不会强迫他们做任何事情。如果他们没有定义析构函数,编译器将为他们做这件事。@Tadeusz:即使它是基中的纯虚拟函数?是-用gcc 3.4.5测试。问:C++标准是否符合?第一点也不相干;基类析构函数必须有一个实现,即使它是纯虚拟的。标准12.4.7“析构函数可以声明为虚拟(10.3)或纯虚拟(10.4);如果在程序中创建了该类或任何派生类的任何对象,则应定义析构函数。如果一个类有一个带有虚拟析构函数的基类,则其析构函数(无论是用户声明还是隐式声明)都是虚拟的。”这确实是答案,最符合我的问题。