为什么是虚析构函数
Why virtual destructor?
我正在浏览一些代码,计划将其用于我的研究。头文件是这样的
#ifndef SPECTRALCLUSTERING_H_
#define SPECTRALCLUSTERING_H_
#include <vector>
#include <eigen3/Eigen/Core>
class SpectralClustering {
public:
SpectralClustering(Eigen::MatrixXd& data, int numDims);
virtual ~SpectralClustering();
std::vector<std::vector<int> > clusterRotate();
std::vector<std::vector<int> > clusterKmeans(int numClusters);
int getNumClusters();
protected:
int mNumDims;
Eigen::MatrixXd mEigenVectors;
int mNumClusters;
};
#endif /* SPECTRALCLUSTERING_H_ */
主代码后面的
#include "SpectralClustering.h"
#include <eigen3/Eigen/QR>
SpectralClustering::SpectralClustering(Eigen::MatrixXd& data, int numDims):
mNumDims(numDims),
mNumClusters(0)
所以我不明白为什么在。h文件中使用虚拟析构函数。从这里我们可以了解到,当您可以通过基类指针删除派生类的实例时,虚析构函数非常有用。但我认为这段代码不是这样的。有人能解释一下这一切吗?
将析构函数设置为虚函数的原因是您计划以多态方式继承和使用该类。如果我们有
class Foo {};
class Bar : public Foo {};
Foo * f = new Bar();
delete f; // f's destructor is called here
将调用Foo
的析构函数,并且不会取消对象Bar
部分的成员。如果Foo
有虚析构函数,那么虚函数表查找将发生,Bar
析构函数将被调用,而不是正确地销毁对象。
假定这个类可以被继承。否则,应该使用说明符final
来声明。
考虑类的数据成员具有访问控制说明符protected
。这意味着类的作者不排除该类可以被继承。
代码可能是以这样一种方式编写的,即通过派生自定义类来定制类实现是支持的。
框架的用户可以用这种方式自定义框架,而不需要直接修改框架代码。因此,可能有一种方法可以使用您的派生类来代替原始的SpectralClustering
类,甚至代替SpectralClustering
派生的任何类(不是在这种情况下,因为它不派生任何东西)。框架很可能会删除使用基类引用的实例,而实际的实现是派生的。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 通过引用传递-为什么要调用这个析构函数
- 为什么使用析构函数会使类不可复制?
- 为什么类构造函数为其成员生成析构函数?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 为什么析构函数挂起
- 为什么这里不调用析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 为什么为未删除的对象调用析构函数?
- 为什么添加析构函数(甚至是空的)会破坏我的结构,该结构使用 ref 转发和折叠来保存 ref 或值的副本?
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么在运算符删除中不调用析构函数?
- 如何析构单例实例,或者为什么以下代码适用于析构函数?
- 为什么在析构函数中引发异常时不调用重载删除
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 如果构造函数和析构函数可以获取和显示(打印)数据,为什么我们需要 getter 和 setter?
- 为什么 "=default" 析构函数与隐式声明的析构函数不同?
- 在C++中,当重新分配对象时,为什么构造函数在析构函数之前触发?
- 为什么析构函数不接受C++中的参数?