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

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

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

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

22.10.2013, 14:30. Просмотров 291. Ответов 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++
Ребят для чего здесь используется виртуальный деструктор? using namespace std; class Ostanovki { protected: char* name; ...

Обязательно ли объявление виртуального деструктора в абстрактном классе - C++
Недавно выполнял задание, и забыл в абстрактном классе(использовалось наследование) объявить виртуальный диструктор. С точки зрения...

Массивы, магия - C++
Есть код: #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main(void) { int yams; yams = 7; yams =...

Магия отладчика - C++
Доброго времени суток! Возник такой вопрос: я использую среду разработки code::blocks 16.01 с компилятором mingw, и при просмотре того, как...

Магия со статическими массивами - C++
Предисловие: на форуме подняли топик http://www.cyberforum.ru/cpp-beginners/thread1065365.html , в голове сразу мелькнула мысль...

Строки char и магия - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main(void) { cout &lt;&lt; &quot;Vvedite...

Шаблонная магия и метод класса - C++
Нужно передать в качестве параметра шаблона указатель на метод класса, после чего распарсить его на составляющие типы. Помоему это должно...

Конструкция switch - магия какая-то - C++
Сел позавчера за изучение плюсов, изучаю по книжке В.В.Подбельского В этой книжке приведён пример использования конструкции switch. Сама...

Магия при компиляции больших проектов - C++
Приветствую товарищи. Пишу(сал) большой проект разбитый на несколько библиотек, консолей, windows приложений и т.к. И недавно с ним стала...

Отключение деструктора - C++
Вопрос такой. Возможно ли каким-то образом предотвратить вызов деструктора при уничтожении объекта? У меня есть вот такой класс самодельных...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
22.10.2013, 14:36     Магия виртуального деструктора #2
Цитата Сообщение от Erjay Посмотреть сообщение
каким образом, объявление деструктора базового класса как virtual, приводит к вызову обоих деструкторов?
Таким, что вызовется деструктор Student, который и вызовет деструктор Person, как и положенно
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.10.2013, 14:39     Магия виртуального деструктора #3
delete
alsav22
5416 / 4812 / 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     Магия виртуального деструктора
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru