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

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

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

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

23.07.2013, 11:50. Просмотров 452. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 11:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Виртуальные деструкторы (C++):

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

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

виртуальные и чисто виртуальные функции - C++
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто виртуальную? #include <iostream> using...

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

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

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

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

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

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

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

Блин, виртуальные деструкторы работают - чем они не угодили?
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 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;
}
1
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 12:38  [ТС] #10
ForEveR, большое спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 12:38
Привет! Вот еще темы с ответами:

Конструкторы и деструкторы - C++
Необходимо реализовать класс с двумя полями, имеющими имена first и second. Обязательно должны присутствовать: Для инициализации...

Где деструкторы? - C++
Ребят сижу разбираю код на С++,не могу понять где диструктор тут.. #include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; ...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.07.2013, 12:38
Ответ Создать тему
Опции темы

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