2012-06-10 2 views
0

Предположим, что мы имеем:C++: Каков правильный способ удаления экземпляра производного класса?

class A { 
protected: 
    int* iArr; 
    float *fArr; 
public: 
    A(int* iArr,float *fArr); 
    ~A(); 
} 

class B : public A { 
private: 
    double *dArr; 
public: 
    B(int* iArr,float *fArr,double *dArr); 
    ~B(); 
} 

мой intuation, что это будет вызывать только деструктор B, но когда я запустил его на Visual C++ я увидел, что, когда разрушающие экземпляр из B он вызывает как A, а затем B деструктор.

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

Edit:

  1. , если это так, то, что если ребенок простирающийся родительский класс только первостепенных функций, то это значит, что я оставить деструктор ребенка пустым?

  2. что делать, если я хочу изменить это? Я имею в виду, что, если я хочу, чтобы вызывался только деструктор ребенка? Есть ли способ сделать это?

+0

Для справок в будущем правильные термины являются родительскими и дочерними по отношению к отцу и сыну, но при работе с классами он обычно является базовым и производным. – chris

+0

после вызова деструктора родительского класса, вызовет дочерний класс! –

+0

@MaziarBouali: Вы уверены, что это не так? Обычно материал разрушается в обратном порядке, чем он был построен; то есть последний построенный, сначала разрушенный ... – cHao

ответ

2

Деструктор A должен быть виртуальным. Ваша проблема заключается, что если вы сделаете следующее:

A* b = new B(iArr, fArr, dArr); 
delete b; 

Тогда деструктор B не будет вызван, потому что б в то же время экземпляра как B выглядит как А и деструктор Б не имеет записи в виртуальной таблице что означает, что он не знает его там (т.е. он считает его просто А)

Edit:

в ответ на 1 вы можете оставить деструктор пустой, или вы не смогли определить его.

В ответ на 2 вы не можете этого сделать. Вам будет лучше иметь виртуальную защищенную функцию под названием «Уничтожить» или что-то, что вызвано из деструктора базового класса. Это единственный способ, с помощью которого я могу управлять уничтожением, как вы описываете.

+0

, пожалуйста, обратитесь к моему редактированию тоже ... –

6

Одним словом, да.

Деструктор родительского класса всегда вызывается автоматически. Его задача - освободить все ресурсы, используемые родительским классом.

Деструктор дочернего класса несет ответственность за освобождение вещей, характерных для дочернего класса.

Кроме того, если вы когда-либо удаляете экземпляры дочернего класса с помощью указателя на родительский класс, вам необходимо сделать дескриптор родительского класса виртуальным. См. When to use virtual destructors?

+0

, пожалуйста, обратитесь к моему редактированию тоже ... –

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