виртуальный деструктор
В C++ конструктор не может быть определен как вымышленный конструктор, поскольку конструктор вызывается только тогда, когда создается экземпляр объекта, а реализация виртуальной функции фактически вызывается через указатель таблицы виртуальных функций, и обновление объекта не происходит. конечно, его нельзя вызвать без места в памяти, поэтому фиктивный конструктор перед созданием объекта бессмысленен и не может быть реализован.
Однако деструкторы могут быть виртуальными функциями, и в большинстве случаев они объявляются как виртуальные деструкторы. Таким образом, когда объект производного класса, на который указывает указатель базового класса, освобождается, деструктор подкласса может быть динамически скомпилирован и вызван в соответствии с фактическим типом объекта, на который указывает, чтобы добиться правильного освобождения памяти объекта. .
Давайте проведем эксперимент ниже, пожалуйста, посмотрите на код:
/************************************//Des: Демо-учебник по C++//Автор: Хуанг/ /Авторские права:www.dotcpp.com//Дата:27/12/2017********************************* * *******/#include<iostream>usingnamespacestd;classPoint{private:intx,y;int*str;public:Point(intx=0,inty=0){this->x=x;this- > y=y;str=newint[100];}~Point(){delete[]str;cout<<CalledPoint'sDestructorandDeletedstr!<<endl;}};classCircle:publicPoint{private:intr;int*str;public : Circle(intx,inty,intR):Point(x,y){r=R;str=newint[100];}~Circle(){delete[]str;cout<<CalledCircle'sDestructorandDeletedstr!<<endl; } };intmain(){Point*p;p=newCircle(10,10,20);deletep;return0;}
Вы можете увидеть код. В базовом классе нет деструктора, объявленного с помощью virtual , и как базовый класс, так и производный класс имеют динамическое распределение памяти. Затем мы создаем класс Circle в основной функции путем динамического выделения памяти, а затем удаляем. Скриншот после запуска такой:
Хорошо видно, что вызывается только деструктор базового класса, так что 4*100 байт новой памяти в производном классе останутся, вызывая утечку памяти!
А если деструктор в базовом классе объявить виртуальным, результат будет совсем другим! В это время появляется полиморфный эффект. Он сначала освобождает пространство производного класса, а затем освобождает пространство памяти базового класса. Завершается идеально, как показано ниже:
Выше перечислены преимущества виртуального деструктора, вы можете убедиться в этом сами.