C ++ удаляет унаследованный класс - PullRequest
5 голосов
/ 07 июня 2011

Допустим, есть класс Объект , а затем еще один класс Cat , который наследует Объект . Далее есть список Объект * (указатели). Затем я создаю новый Cat и помещаю его в список. Через некоторое время я хочу удалить все Кошки и вызвать delete для каждого члена списка. Вызывает ли он деструктор Кошка ?

Ответы [ 4 ]

19 голосов
/ 07 июня 2011

Да, если вы пометили деструктор объекта как виртуальный.

class Object {
  public:
  virtual ~Object(){} //make the base class destructor virtual
};

class cat : public Object {
  public:
  virtual ~cat(){} // now this gets called when a pointer to Object that is a cat is destroyed
}
7 голосов
/ 07 июня 2011

Если деструктор Объекта является виртуальным, да.

3 голосов
/ 07 июня 2011

То, что вы описываете, это как раз та ситуация, когда приходят виртуальные деструкторы. Прочитайте C ++ FAQ .

0 голосов
/ 07 июня 2011

Да, если деструктор class Object (базовый класс) объявлен виртуальным, в противном случае вы столкнетесь с неопределенным поведением, которое вам не нужно.

...