Область действия чисто виртуальных функций при уничтожении производного класса - в C ++ - PullRequest
4 голосов
/ 29 июня 2010

Во время уничтожения объекта производного класса я сначала нажимаю деструктор производного класса, а затем деструктор базового класса (как и ожидалось). Но мне было любопытно выяснить - в какой момент функции производного класса выходят из области видимости (уничтожаются).

Это происходит, как только элемент управления покидает деструктор производного класса и направляется к базе? Или это произойдет, когда мы закончим с деструктором базового класса.

Спасибо

Ответы [ 2 ]

8 голосов
/ 29 июня 2010

Как только деструктор самого производного класса заканчивается, динамический тип объекта может считаться типом следующего менее производного типа. То есть вызов виртуального метода в базовом деструкторе обнаружит, что окончательный переопределитель в этот момент времени находится на базовом уровне. (Происходит обратное во время строительства)

struct base {
   base() { std::cout << type() << std::endl; }
   virtual ~base() { std::cout << type() << std::endl; }
   virtual std::string type() const {
      return "base";
   }
};
struct derived : base {
   virtual std::string type() const {
      return "derived";
   }
};
int main() {
   base *p = new derived;
   std::cout << p->type() << std::endl;
   delete p;
}
// output:
// base
// derived
// base
4 голосов
/ 29 июня 2010

Функции не уничтожаются.

Виртуальные функции, однако, удаляют свои записи в v-таблице, как только завершается производный деструктор, поэтому вы не можете вызывать производные виртуальные функции из базового d'tor..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...