2015-08-19 3 views
3

Я иду через некоторый код, планируют адаптировать его для моего заголовка файла 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 мы можем узнать, что виртуальные деструкторы полезны, когда вы можете удалить экземпляр производного класса с помощью указателя на базовый класс. Но я думаю, что это не случай с этим кодом. Может кто-нибудь объяснить все это?

+5

Если они не определились с виртуальным деструктором, это связано с тем, что они предполагают, что кто-то создает производный класс, используя «SpectralClustering» в качестве базового класса. – CoryKramer

ответ

7

Причина, по которой вы создадите виртуальный виртуальный деструктор, заключается в том, что вы планируете наследовать этот класс и использовать его полиморфно. Если бы мы имели

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

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

Деструктор для Foo будет называться и не члены Bar части объекта не будет уничтожен. Если у Foo был виртуальный деструктор, тогда будет выполняться поиск в vtable, и вместо этого будет вызван деструктор Bar, который правильно уничтожит объект.

1

Предполагается, что класс может быть унаследован. В противном случае он должен быть объявлен спецификатором final.

Учитывайте, что члены данных класса имеют спецификатор контроля доступа protected. Это означает, что автор класса не исключает, что класс может быть унаследован.

0

Код, вероятно, был написан таким образом, что поддерживается реализация классов путем создания пользовательских классов.

Пользователь фреймворка может настроить инфраструктуру таким образом, без необходимости напрямую изменять код рамки. Таким образом, вероятно, есть способ использовать ваш производный класс вместо исходного класса SpectralClustering, или даже вместо любого класса SpectralClustering происходит (не в этом случае, поскольку он не получается ни от чего). Структура может очень хорошо удалять экземпляры с использованием ссылок на базовые классы, тогда как фактическая реализация получена.

Смежные вопросы