У меня есть базовый класс и производный класс. Я хочу, чтобы пользователь решил, когда free()
память, выделенная обоими классами, и эти функции также будут вызываться деструкторами классов.Функция базового класса вызывается дважды
Однако этот подход заставляет функцию базового класса free()
вызываться дважды, первый раз из производного класса free()
, а второй раз из базового деструктора.
class Base
{
public:
Base() {
_baseVal = new int(4);
cout << "base constructor\n";
}
virtual void free()
{
if(_baseVal) {
delete _baseVal;
_baseVal = 0;
}
cout << "base free()\n";
}
virtual ~Base() {
free();
}
private:
int *_baseVal;
};
class Derived : public Base
{
public:
Derived() {
_derivedVal = new int(10);
cout << "derived constructor\n";
}
void free()
{
Base::free();
if(_derivedVal) {
delete _derivedVal;
_derivedVal = 0;
}
cout << "derived free()\n";
}
~Derived() {
free();
}
private:
int *_derivedVal;
};
int main()
{
Base *der = new Derived;
delete der;
system("pause");
return 0;
}
Выход:
base constructor
derived constructor
base free()
derived free()
base free()
Есть ли способ для этого подхода, который не заставит базу free()
называться дважды?
Не вызывайте 'Base :: free()' из 'Derived :: free()'. – juanchopanza
Но что делать, если пользователь хочет использовать экземпляр? Возможно, перераспределите память целых чисел. Я не писал функцию 'allocate()', чтобы вещи не усложнялись. – Pilpel
продолжать использовать его после уничтожения ?? –