为什么是虚拟析构函数?
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 引用的实例,而实际的实现是派生的。
我正在查看一些代码,计划针对我的 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 引用的实例,而实际的实现是派生的。