2014-01-22 4 views
0

Я знаю, что они используются для получения деструктора любых подклассов (при удалении указателя). Но что происходит в фоновом режиме?Зачем нужны виртуальные деструкторы?

Я имею в виду, что подкласс наследует этот виртуальный деструктор своего базового класса. Наследовать что-то значит для меня, чтобы получить что-то такое, как оно есть. Но в этом случае подкласс не получает тот же деструктор, который имеет базовый класс. (Может быть, он получает то же самое, особенно если у него нет тела). Дело в том, что он делает другие вещи, даже если подкласс не переопределяет его. Итак, как это работает?

Допустим, мы имеем (C++):

class BaseClass{ 
    int i; 
    public: 
    virtual ~BaseClass(){} 
}; 

class SubClass: public BaseClass{ 
    int j; 
}; 

BaseClass* bptr = new SubClass; 
delete bprt; 

В этом случае мы хотим, чтобы программа освобождения памяти объекта потребностей типа подкласса. То есть, унаследованный int i и собственный int j. Если у нас не было виртуального деструктора в BaseClass, тогда будет использован деструктор, созданный по умолчанию в BaseClass (у него есть пустое тело, и после этого все члены BaseClass будут удалены и память освободится).

Большой вопрос: виртуальный деструктор в BaseClass будет наследоваться SubClass, но SubClass не переопределяет его. Почему унаследованный деструктор больше, чем в классе, на который он унаследован? (он удаляет как целые числа i, так и j при выполнении объекта SubClass)

+0

Это C++? И все же классы не имеют точек с запятой в конце, но это не может быть C#, .... oh для языкового тега – doctorlove

+0

Теперь у них есть точки с запятой;) Да, это C++ – Daniel

+0

Я не совсем понимаю, что «Почему унаследованный деструктор больше, чем в классе, на который он унаследован? " означает – doctorlove

ответ

0

Во-первых, как new как распределяет память, а затем запускает конструктор, delete будет запускать деструкторы, а затем освобождать память.

Когда вы создаете новый SubClass, он сначала создает BaseClass и запускает его конструктор, затем делает SubClass и запускает его конструктор.

Когда мы вызываем delete, деконструкция происходит в обратном порядке. Сначала удаляется Subclass, затем BaseClass.

Обратите внимание: сначала это отличается от других виртуальных функций - только один экземпляр переопределенной функции будет вызван. Деструкторы являются особыми.

Если BaseClass не является виртуальным, они, когда вы вызываете delete bprt;, вызывается только деструктор BaseClass. Это плохо.

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

Почему это беспокоило? Поскольку деструктор вызывается, когда вы вызываете объект delete, или он выходит из области видимости. Делает ли это «делать больше» - ну нет, не в этом случае.

+0

«Больше» Я имею в виду освобождение памяти.SubClass имеет еще одно целое число для освобождения. И это освобождение работает, хотя используется унаследованный деструктор базового класса, который не может знать об этом дополнительном целое. Но вы сказали, что компилятор создаст новый деструктор для 'SubClass', поэтому я предполагаю, что он будет использоваться. – Daniel

+0

Оба деструктора вызываются в обратном порядке конструкторов – doctorlove

+0

Хорошо, думаю, я получил его сейчас;) Thx – Daniel

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