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

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

Восстановить пароль Регистрация
 
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 11:50     Виртуальные деструкторы #1
Можно ли вызвать деструктор базового класса вместо использования виртуальных деструкторов?

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++ виртуальные и чисто виртуальные функции
C++ Деструкторы
Наследование. Виртуальные методы/деструкторы. C++
Где деструкторы? C++
C++ Деструкторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
23.07.2013, 11:53     Виртуальные деструкторы #2
Зачем? Деструкторы для того и есть, чтобы не вызывать их явно.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 11:57  [ТС]     Виртуальные деструкторы #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Зачем? Деструкторы для того и есть, чтобы не вызывать их явно.
так можно или нельзя? ведь при таком удалении сначала вызывается деструктор производного класса, а потом базового
zer0mail
2189 / 1872 / 187
Регистрация: 03.07.2012
Сообщений: 6,665
Записей в блоге: 1
23.07.2013, 11:58     Виртуальные деструкторы #4
Деструктор базового класса вызовется автоматически после завершения работы деструктора производного класса.
Можешь сам убедиться, сделав консольные сообщения в них.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
23.07.2013, 12:01  [ТС]     Виртуальные деструкторы #5
Цитата Сообщение от zer0mail Посмотреть сообщение
Можешь сам убедиться, сделав консольные сообщения в них.
я уже так делал. в этой программе я поудалял эти строчки

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

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

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

Блин, виртуальные деструкторы работают - чем они не угодили?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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++
C++ Виртуальные деструкторы
Конструкторы и деструкторы C++

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

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

Текущее время: 04:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru