Я понимаю, что производный класс совместим по типу с указателем на его базовый класс. В данном примере кода new bar
построение объекта происходит, вызывая foo::foo()
, за которым следует bar::bar()
. В соответствующих конструкторах я выделяю ресурсы для членов класса foo::int *a
и bar::int *b
.
Теперь я инициализирую таким образом построенный объект типом базового класса. С obj
я могу вызвать деструктор базового класса, но не деструктор производного класса. Итак, как я могу освободить ресурсы производного класса в этом случае? Разве это не утечка памяти?
#include <iostream>
class foo
{
int *a;
public:
foo()
{
a = new int[5];
std::cout << "\n foo constructor" << std::endl;
}
~foo()
{
std::cout << "\n foo destructor" << std::endl;
delete[] a;
}
};
class bar : public foo
{
int *b;
public:
bar()
{
b = new int[5];
std::cout << "\n bar constructor" << std::endl;
}
~bar()
{
std::cout << "\n bar destructor" << std::endl;
delete[] b;
}
};
int main()
{
foo *obj = new bar; // Derived class object is type compatible with base class
delete obj; // Equivalent to obj->~foo();
return 0;
}
Спасибо.