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

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

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

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

22.10.2013, 14:30. Просмотров 299. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 14:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Магия виртуального деструктора (C++):

Объяснить использование виртуального деструктора - C++
Ребят для чего здесь используется виртуальный деструктор? using namespace std; class Ostanovki { protected: char* name; ...

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

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

Магия OpenMP - C++
Есть такой код: Expr = ... // vector&lt;pair&lt;size_t, double&gt;&gt; #ifdef _OPENMP #pragma omp parallel num_threads( 2==(size_level-ptr) ? 1...

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

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

4
Croessmah
Эксперт CЭксперт С++
13514 / 7673 / 867
Регистрация: 27.09.2012
Сообщений: 18,896
Записей в блоге: 3
Завершенные тесты: 1
22.10.2013, 14:36 #2
Цитата Сообщение от Erjay Посмотреть сообщение
каким образом, объявление деструктора базового класса как virtual, приводит к вызову обоих деструкторов?
Таким, что вызовется деструктор Student, который и вызовет деструктор Person, как и положенно
1
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.10.2013, 14:39 #3
delete
1
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.10.2013, 14:53 #4
destroy() принимает указатель на базовый класс. Если виртуальности нет, то будет вызван метод по типу указателя, т.е. деструктор Person. Если же виртуальность есть, то будет вызван метод по типу объекта, с которым связан указатель (в данном случае Student), т.е. деструктор Student, который, в свою очередь, вызовет деструктор Person.
2
Erjay
0 / 0 / 0
Регистрация: 03.08.2013
Сообщений: 91
31.10.2013, 22:57  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
destroy() принимает указатель на базовый класс. Если виртуальности нет, то будет вызван метод по типу указателя, т.е. деструктор Person. Если же виртуальность есть, то будет вызван метод по типу объекта, с которым связан указатель (в данном случае Student), т.е. деструктор Student, который, в свою очередь, вызовет деструктор Person.
alsav22, именно это я и хотел узнать! Прекрасное объяснение!
0
31.10.2013, 22:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 22:57
Привет! Вот еще темы с ответами:

Строки 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...

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

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

Магия препроцессора, или вложенные макросы! - C++
Hello world! Есть следующий код: #define ENUM_TO_STRING_STRING_TYPE std::string #define ENUM_CLASS_TO_STRING_DECL( __ENUM__ ) \ ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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