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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
#1

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

22.10.2013, 14:30. Просмотров 272. Ответов 4
Метки нет (Все метки)

Если убрать определение 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 14:30     Магия виртуального деструктора
Посмотрите здесь:

C++ Вызов деструктора
C++ Конструкция switch - магия какая-то
C++ Ошибка деструктора
Строки char и магия C++
Магия со статическими массивами C++
C++ Магия при компиляции больших проектов
C++ Обязательно ли объявление виртуального деструктора в абстрактном классе
C++ Массивы, магия
Объяснить использование виртуального деструктора C++
C++ Магия OpenMP
C++ Шаблонная магия и метод класса
C++ Магия отладчика

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12532 / 7094 / 797
Регистрация: 27.09.2012
Сообщений: 17,504
Записей в блоге: 2
Завершенные тесты: 1
22.10.2013, 14:36     Магия виртуального деструктора #2
Цитата Сообщение от Erjay Посмотреть сообщение
каким образом, объявление деструктора базового класса как virtual, приводит к вызову обоих деструкторов?
Таким, что вызовется деструктор Student, который и вызовет деструктор Person, как и положенно
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.10.2013, 14:39     Магия виртуального деструктора #3
delete
alsav22
5411 / 4807 / 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:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru