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

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

Войти
Регистрация
Восстановить пароль
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

Виртуальные деструкторы - C++

23.07.2013, 11:50. Просмотров 448. Ответов 9
Метки нет (Все метки)

Можно ли вызвать деструктор базового класса вместо использования виртуальных деструкторов?

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
class CBase
{
public:
    CBase(const char *str1)     
    {  
        mStr1 = new char[strlen(str1)+1];  
        strcpy(mStr1, str1); 
    }
 
    virtual ~CBase()                    
    { 
        delete [] mStr1;
    }
 
protected:
    char *mStr1;
};
 
class CDerived : public CBase
{
public:
    CDerived(const char *str1, const char *str2) 
        : CBase(str1)   
    { 
        mStr2 = new char[strlen(str2)+1];  
        strcpy(mStr2, str2);
    }
 
    virtual ~CDerived()                                             
    {  
        delete [] mStr2;
    }
 
protected:
    char *mStr2;
};
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    CBase   *ptrBase;   // указатель на базовый класс
 
    ptrBase = new CDerived("String1", "String2");   // присвоение адреса производного класса
    delete ptrBase;     // удаление объекта
    
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 11:50     Виртуальные деструкторы
Посмотрите здесь:

Виртуальные деструкторы - C++
#include <iostream> using namespace std; class first { public: first(); virtual ~first(){delete pointer;} virtual void...

Наследование. Виртуальные методы/деструкторы. - C++
Есть базовый класс Cell (код можно даже не смотреть - он просто для иллюстрации -> вопрос внизу) class Cell { friend class Obstacle;...

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

Деструкторы - C++
Всем доброго времени суток! Возникли некоторые непонятки с деструкторами, а точнее их время вызова и механизм работы. Вот код: ...

Деструкторы - C++
Вообщем сразу к сути. В нижеприведенном примере вызывается 2 деструктора. Я никак не пойму, почему именно два? вот сам метод: ...

Конструкторы и деструкторы - C++
Не понимаю, как закончить программу. Написала конструктор и деструктор, хотя он тут и не нужен по идее. Но по заданию сделала. А как...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,011
23.07.2013, 11:53     Виртуальные деструкторы #2
Зачем? Деструкторы для того и есть, чтобы не вызывать их явно.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 11:57  [ТС]     Виртуальные деструкторы #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем? Деструкторы для того и есть, чтобы не вызывать их явно.
так можно или нельзя? ведь при таком удалении сначала вызывается деструктор производного класса, а потом базового
zer0mail
2329 / 1955 / 192
Регистрация: 03.07.2012
Сообщений: 7,009
Записей в блоге: 1
23.07.2013, 11:58     Виртуальные деструкторы #4
Деструктор базового класса вызовется автоматически после завершения работы деструктора производного класса.
Можешь сам убедиться, сделав консольные сообщения в них.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 12:01  [ТС]     Виртуальные деструкторы #5
Цитата Сообщение от zer0mail Посмотреть сообщение
Можешь сам убедиться, сделав консольные сообщения в них.
я уже так делал. в этой программе я поудалял эти строчки

мне интересно, можно ли самому вызвать деструктор базового класса
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,011
23.07.2013, 12:03     Виртуальные деструкторы #6
BigLow, да вызвать-то можно. Но это добровольный выстрел в ногу, о последствиях сходу и не скажу.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 12:16  [ТС]     Виртуальные деструкторы #7
стоп. я тут немного перепутал. если в этой программе убрать слово virtual, то при удалении объекта будет вызван только деструктор базового класса, а до производного дело не дойдет

запутался совсем

Добавлено через 6 минут
из базового класса вызывать деструктор производного - это ерунда получается
zer0mail
2329 / 1955 / 192
Регистрация: 03.07.2012
Сообщений: 7,009
Записей в блоге: 1
23.07.2013, 12:18     Виртуальные деструкторы #8
Цитата Сообщение от BigLow Посмотреть сообщение
мне интересно, можно ли самому вызвать деструктор базового класса
Странный вопрос - есть работающий механизм конструкторов/деструкторов и хочешь знать, как его сломать?
Базовый деструктор можно вызвать "вручную", но потом система сама вызовет его еще раз и скорей всего произойдет аварийное завершение.
А деструктор базового класса ничего не должен знать про производные классы (и вызывать их методы).

Блин, виртуальные деструкторы работают - чем они не угодили?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
23.07.2013, 12:23     Виртуальные деструкторы #9
BigLow, Если деструктор не объявлен virtual, но объект используется полифорфно - поприветствуйте UB. Вызвать можно - но это плохая идея.
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
56
57
58
#include <cstring>
#include <clocale>
#include <iostream>
 
class CBase
{
public:
    CBase(const char *str1)     
    {  
        mStr1 = new char[strlen(str1)+1];  
        strcpy(mStr1, str1); 
    }
 
    ~CBase()                    
    { 
       std::cout << "base dtor" << std::endl;
        delete [] mStr1;
    }
 
protected:
    char *mStr1;
};
 
class CDerived : public CBase
{
public:
    CDerived(const char *str1, const char *str2) 
        : CBase(str1)   
    { 
        mStr2 = new char[strlen(str2)+1];  
        strcpy(mStr2, str2);
    }
 
    ~CDerived()                                             
    {  
       std::cout << "derived dtor" << std::endl;
        delete [] mStr2;
    }
 
protected:
    char *mStr2;
};
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    CBase   *ptrBase;   // указатель на базовый класс
 
    ptrBase = new CDerived("String1", "String2");   // присвоение адреса производного класса
    static_cast<CDerived*>(ptrBase)->~CDerived();
    operator delete(ptrBase);
    //delete ptrBase;     // удаление объекта
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 12:38     Виртуальные деструкторы
Еще ссылки по теме:

Констуркторы, деструкторы.... - C++
Необходимо для динамического типа данных описать класс, содержащий указатель на динамический тип как поле данных. Для этого класса описать...

for_each и деструкторы - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; class display { public: display() : i(0) { cout &lt;&lt; &quot;display...

Деструкторы и исключения - C++
В одном учебнике встретилась такая фраза: Если деструктор, вызванный в процессе разматывания стека, выбрасывает исключение, вызывается ...

Конструкторы и деструкторы - C++
#include &lt;iostream&gt; #include &lt;Windows.h&gt; class Try { public: void* px; Try() { printf(&quot;Try\n&quot;); px=malloc(12); }; ...


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

Или воспользуйтесь поиском по форуму:
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 12:38  [ТС]     Виртуальные деструкторы #10
ForEveR, большое спасибо
Yandex
Объявления
23.07.2013, 12:38     Виртуальные деструкторы
Ответ Создать тему
Опции темы

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