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

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

Войти
Регистрация
Восстановить пароль
 
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
#1

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

11.12.2012, 23:52. Просмотров 755. Ответов 10
Метки нет (Все метки)

есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не виртуальный (и является ли он в данном примере виртуальным)и как его потом можно использовать, если он виртуальный, может кто на примере объяснить? спасибо
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Base 
{
    // some virtual methods
};
 
class Derived : public Base
{
    ~Derived()
    {
        // Do some important cleanup
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2012, 23:52     виртуальный деструктор
Посмотрите здесь:

Виртуальный деструктор - C++
Всем привет! Объясните пожалуйста новичку в ООП, вопрос чисто теоретический поэтому код не прилагаю. Мне сказали что если я в классе...

Виртуальный деструктор на MinGW v4.9.2 - C++
не знаю как на прошлых версиях, но на этой не работает чисто виртуальный деструктор. проверялось самым обычным тестом class A{ ...

Виртуальный деструктор и уничтожение объектов - C++
Приветствую всех. вопрос наверное простой так, что не ругайтесь. столкнулся с проблемой освобождения памяти. вот пример кода: ...

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

Деструктор - C++
Вроде все просто но чето никак не работает Задача: Написать программу в которой Конструктор класса MyCl выводит сообщение на...

Деструктор - C++
В каком случае необходимо явно определять деструктор?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.12.2012, 00:00     виртуальный деструктор #2
letnjaja, а зачем он здесь виртуальный?

Добавлено через 3 минуты
Вот пример
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
#include <iostream>
 
class Base
{
public:
   virtual ~Base()
   {
      std::cout << "Destr Base" << std::endl;
   }
};
 
class Derived : public Base
{
public:
   ~Derived()
   {
      std::cout << "Destr Derived" << std::endl;
   }
};
 
int main()
{
   Base* obj = new Derived();
   delete obj;
}
http://liveworkspace.org/code/3WS7po
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
12.12.2012, 00:01  [ТС]     виртуальный деструктор #3
не знаю поэтому и спрашиваю
а в основном классе он может быть виртуальным? точнее да, если может , то наверно в основном, нет?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.12.2012, 00:02     виртуальный деструктор #4
Вот если деструктор не виртуальный, что чревато http://liveworkspace.org/code/vEMJf

Добавлено через 25 секунд
Цитата Сообщение от letnjaja Посмотреть сообщение
а в основном классе он может быть виртуальным?
Посмотрите еще раз мой пример.
MrGluck
Модератор
Эксперт CЭксперт С++
7159 / 4325 / 630
Регистрация: 29.11.2010
Сообщений: 11,750
12.12.2012, 00:31     виртуальный деструктор #5
letnjaja, деструктор следует делать виртуальным, если класс имеет наследников. Производный класс также может быть базовым по отношению к кому-то. Если этого нет, то смысла в виртуальных методах, в т.ч. деструкторе - нет. Если бы класс B наследовался в классе С, то надо было бы деструктор В также сделать виртуальным. Так что да, деструктор производного класса также следует делать виртуальным, если он [класс] является базовым к кому-то еще.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.12.2012, 01:36     виртуальный деструктор #6
Цитата Сообщение от MrGluck Посмотреть сообщение
Производный класс также может быть базовым по отношению к кому-то. Если этого нет, то смысла в виртуальных методах, в т.ч. деструкторе - нет. Если бы класс B наследовался в классе С, то надо было бы деструктор В также сделать виртуальным. Так что да, деструктор производного класса также следует делать виртуальным, если он [класс] является базовым к кому-то еще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A {
public:
   virtual ~A() {}
};
 
class B : public A {
public:
   ~B() {}
};
 
class C : public B {
public:
    ~C() {}
};
деструкторы B и C и так виртуальны, независимо от того стоит ли там virtual
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
12.12.2012, 02:15  [ТС]     виртуальный деструктор #7
если у меня такая запись в файле xxxx.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A {
public:
string name;
int price;
   virtual ~A() {}
};
 
class B : public A {
public:
string author;
   ~B() {}
};
 
class C : public B {
public:
    ~C() {}
};
/----------------------------------------------/
и я пишу в файле xxxxxx.cc следующее, чем это является и как это можно использовать? (если это реально)
class Bublic A
public:
C(string _name, int _price, string _author):author(_author),A(_name, _price) {}
..........................
MrGluck
Модератор
Эксперт CЭксперт С++
7159 / 4325 / 630
Регистрация: 29.11.2010
Сообщений: 11,750
12.12.2012, 02:19     виртуальный деструктор #8
letnjaja, вам надо инициализировать унаследованные поля в конструкторе производного класса? Вызывайте в списке инициализации конструкторы производных классов, передавая им параметры. И не забудьте перед этим определить их (аргументированные конструкторы).
letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
12.12.2012, 02:45  [ТС]     виртуальный деструктор #9
можно пример?
MrGluck
Модератор
Эксперт CЭксперт С++
7159 / 4325 / 630
Регистрация: 29.11.2010
Сообщений: 11,750
12.12.2012, 02:49     виртуальный деструктор #10
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
#include <iostream>
 
class A
{
    public:
        A() {}
        A(int a) : a_(a) {}
    private:
        int a_;
};
 
class B : public A
{
    public:
        B() {}
        B(int a, int b) : A(a), b_(b) {}
    private:
        int b_;
};
 
class C : public B
{
    public:
        C() {}
        C(int a, int b, int c) : B(a, b), c_(c) {}
    private:
        int c_;
};
 
int main()
{
    C c(1, 2, 3);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2012, 15:14     виртуальный деструктор
Еще ссылки по теме:

Деструктор - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #define _CRTDBG_MAP_ALLOC #include &lt;crtdbg.h&gt; using namespace std; class list{ ...

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

Не работает деструктор - C++
Выписал пример из самоучителя, но выяснилось что не работает деструктор. В чем проблема? #include &lt;iostream&gt; using namespace std; ...

Нужен ли деструктор? - C++
Вопрос туп, но что-то переклинило, извиняйте. Делаю в Qt. class A { QList&lt;int&gt;* list public: A() { list = new...


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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.12.2012, 15:14     виртуальный деструктор #11
Цитата Сообщение от MrGluck Посмотреть сообщение
Производный класс также может быть базовым по отношению к кому-то. Если этого нет, то смысла в виртуальных методах, в т.ч. деструкторе - нет. Если бы класс B наследовался в классе С, то надо было бы деструктор В также сделать виртуальным.
Не надо. Т.е. не обязательно. http://liveworkspace.org/code/vEMJf$13

Добавлено через 46 секунд

Не по теме:

Jupiter, не заметил твой ответ. Извини.

Yandex
Объявления
12.12.2012, 15:14     виртуальный деструктор
Ответ Создать тему
Опции темы

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