Форум программистов, компьютерный форум CyberForum.ru

Магия виртуального деструктора - C++

Восстановить пароль Регистрация
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
22.10.2013, 14:30     Магия виртуального деструктора #1
Если убрать определение virtual (стр. 18), то вызывается (47) только деструктор класса Person (деструктор Student не вызывается).
Вопрос: каким образом, объявление деструктора базового класса как virtual, приводит к вызову обоих деструкторов?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// DestruktorWirtualny.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
class Person
{
public:
    Person (char* pszName)
    {   
        cout << "Konstruktor Person" << endl;
        psName = new string (pszName);
    }
    virtual ~Person ()
    {
        cout << "Destruktor Person" << endl;
        delete psName; psName = 0;
    }
private:
    string* psName;
};
 
class Student: public Person
{
public:
    Student (char* pszName, unsigned ID)
        : Person (pszName)
    {
        cout << "Konstruktor Student" <<endl;
        mID = new unsigned (ID);
    }
    ~Student()
    {
        cout << "Destruktor Student" << endl;
        delete mID; mID = 0;
    };
private:
    unsigned* mID;
};
 
void destroy (Person* p)
{
    delete p;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    Student * student = new Student ("Pavlo Zvarych", 7712);
    destroy (student);
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11847 / 6826 / 771
Регистрация: 27.09.2012
Сообщений: 16,924
Записей в блоге: 2
Завершенные тесты: 1
22.10.2013, 14:36     Магия виртуального деструктора #2
Цитата Сообщение от Erjay Посмотреть сообщение
каким образом, объявление деструктора базового класса как virtual, приводит к вызову обоих деструкторов?
Таким, что вызовется деструктор Student, который и вызовет деструктор Person, как и положенно
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.10.2013, 14:39     Магия виртуального деструктора #3
delete
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 14:53     Магия виртуального деструктора #4
destroy() принимает указатель на базовый класс. Если виртуальности нет, то будет вызван метод по типу указателя, т.е. деструктор Person. Если же виртуальность есть, то будет вызван метод по типу объекта, с которым связан указатель (в данном случае Student), т.е. деструктор Student, который, в свою очередь, вызовет деструктор Person.
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
31.10.2013, 22:57  [ТС]     Магия виртуального деструктора #5
Цитата Сообщение от alsav22 Посмотреть сообщение
destroy() принимает указатель на базовый класс. Если виртуальности нет, то будет вызван метод по типу указателя, т.е. деструктор Person. Если же виртуальность есть, то будет вызван метод по типу объекта, с которым связан указатель (в данном случае Student), т.е. деструктор Student, который, в свою очередь, вызовет деструктор Person.
alsav22, именно это я и хотел узнать! Прекрасное объяснение!
Yandex
Объявления
31.10.2013, 22:57     Магия виртуального деструктора
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru