我正在检查一些代码,计划对其进行调整以适合我的研究。因此头文件如下所示

#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文件中使用虚拟析构函数。从this中我们可以知道,当您可以通过指向基类的指针删除派生类的实例时,虚拟析构函数很有用,但是我认为这段代码不是这种情况,有人可以解释所有这些吗?

最佳答案

将析构函数虚拟化的原因是,您计划该类被多态继承和使用。如果我们有

class Foo {};
class Bar : public Foo {};

Foo * f = new Bar();
delete f; // f's destructor is called here

会调用Foo的析构函数,并且不会销毁该对象的Bar部分的成员。如果Foo具有虚拟析构函数,则将执行vtable查找,而Bar析构函数将被调用,而不是正确地销毁对象。

关于c++ - 为什么要使用虚拟析构函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32094700/

10-13 06:29