为什么是虚拟析构函数?

Why virtual destructor?

我正在查看一些代码,计划针对我的 research.So 头文件进行调整,如下所示

#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.But 的指针删除派生 class 的实例时,虚拟析构函数很有用我认为这不是这种情况 code.Can 有人解释这一切吗?

将析构函数设为虚拟的原因是您计划 class 被继承并以多态方式使用。如果我们有

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

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

Foo 的析构函数将被调用,对象的 Bar 部分的任何成员都不会被销毁。如果 Foo 有一个虚拟析构函数,那么会在 Bar 析构函数被调用而不是正确销毁对象时进行 vtable 查找。

假设class可以继承。否则应使用说明符 final.

声明

考虑到 class 的数据成员具有访问控制说明符 protected。也就是说class的作者不排除class可以继承

代码可能是以这样的方式编写的,支持通过派生自定义 classes 来自定义 class 实现。

框架的用户可以通过这种方式自定义框架,而不需要直接更改框架代码。因此,可能有一种方法可以使用派生的 class 代替原始的 SpectralClustering class,甚至代替任何 class SpectralClustering 派生自(在这种情况下不是,因为它不源自任何东西)。该框架很可能会删除使用基本 class 引用的实例,而实际的实现是派生的。