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

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

Восстановить пароль Регистрация
 
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
11.12.2012, 23:52     виртуальный деструктор #1
есть такой пример, у меня вопрос, почему здесь деструктор декларирован просто как деструктор, а не виртуальный (и является ли он в данном примере виртуальным)и как его потом можно использовать, если он виртуальный, может кто на примере объяснить? спасибо
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++ деструктор
C++ Деструктор
Виртуальный деструктор C++
Вопрос новичка про виртуальный деструктор C++
почему виртуальный деструктор вызывается дважды? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 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
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
12.12.2012, 00:01  [ТС]     виртуальный деструктор #3
не знаю поэтому и спрашиваю
а в основном классе он может быть виртуальным? точнее да, если может , то наверно в основном, нет?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
12.12.2012, 00:02     виртуальный деструктор #4
Вот если деструктор не виртуальный, что чревато http://liveworkspace.org/code/vEMJf

Добавлено через 25 секунд
Цитата Сообщение от letnjaja Посмотреть сообщение
а в основном классе он может быть виртуальным?
Посмотрите еще раз мой пример.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
12.12.2012, 00:31     виртуальный деструктор #5
letnjaja, деструктор следует делать виртуальным, если класс имеет наследников. Производный класс также может быть базовым по отношению к кому-то. Если этого нет, то смысла в виртуальных методах, в т.ч. деструкторе - нет. Если бы класс B наследовался в классе С, то надо было бы деструктор В также сделать виртуальным. Так что да, деструктор производного класса также следует делать виртуальным, если он [класс] является базовым к кому-то еще.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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
 Аватар для 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
12.12.2012, 02:19     виртуальный деструктор #8
letnjaja, вам надо инициализировать унаследованные поля в конструкторе производного класса? Вызывайте в списке инициализации конструкторы производных классов, передавая им параметры. И не забудьте перед этим определить их (аргументированные конструкторы).
letnjaja
 Аватар для letnjaja
53 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 200
12.12.2012, 02:45  [ТС]     виртуальный деструктор #9
можно пример?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
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++
C++ Виртуальный деструктор и уничтожение объектов
C++ Виртуальный деструктор, для чего нужен?

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 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     виртуальный деструктор
Ответ Создать тему
Опции темы

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