Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что это такое и как можно использовать? 
:(
    Опции темы
gr1fon
Дата 17.8.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.8.2007

Репутация: 1
Всего: 1



class A
{
public:
virtual ~A() = 0;
};

PM MAIL   Вверх
Partizan
Дата 17.8.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



виртуальные деструкторы используют для того чтобы гарантировать в каждом из наследников реализацию деструктора....


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bsa
Дата 17.8.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Это абстрактный класс. Он не разрешает создание объектов. Он требует, чтобы были потомки со своими деструкторами (точнее, хотя бы один потомок).
PM   Вверх
Fazil6
Дата 17.8.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

 Что это такое и как можно использовать?

это сделано для того, чтобы класс был абстрактным (нельзя создавать экземпляры A) и использовался как базовый. Вообще-то здесь довольно бессмысленный класс, так как он вроде как должен быть базовым, но интерфейса никакого не объявлено. Кстати реализация деструктора тоже должна быть в этом классе A/

Цитата(Partizan @  17.8.2007,  15:16 Найти цитируемый пост)
виртуальные деструкторы используют для того чтобы гарантировать в каждом из наследников реализацию деструктора....

хм... интересная мысль... Вообще-то деструктор виртуальный нужен для правильного вызова деструкторов при разрушении объекта при полиморфном использовании и совсем не обязательно явно реализовывать деструкторы в наследниках, даже если в базовом он виртуальный.

PM MAIL   Вверх
Dreamer_0x01
Дата 17.8.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 12



Как абсолютно правильно уже указали, это абстрактный класс. 
Запись вида 
Код

virtual [тип функции] func([параметры]) = 0;

называется "чисто виртуальной функцией" (pure virtuale).
При наличии хотя бы одной такой функции класс становится абстрактным. Это означает, что вы не можете создавать объекты такого класса, а виртуальные функции обязательно должны быть переопределены в производных классах. Однако, вы можете пользоваться указателем на объект такого класса при реализации полиморфности. 

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


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
zkv
Дата 17.8.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Fazil6 @  17.8.2007,  15:32 Найти цитируемый пост)
Кстати реализация деструктора тоже должна быть в этом классе A

можно пояснить? Какая реализация, если метод (деструктор) объявлен абстрактным?
Честно говоря, не сталкивался с применением абстрактных деструкторов...
PM MAIL   Вверх
Partizan
Дата 17.8.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



Fazil6, согласен


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
sentry
Дата 17.8.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: 1
Всего: 10



Цитата(Partizan @  17.8.2007,  16:46 Найти цитируемый пост)
виртуальные деструкторы используют для того чтобы гарантировать в каждом из наследников реализацию деструктора....

Цитата(bsa @  17.8.2007,  16:51 Найти цитируемый пост)
Он требует, чтобы были потомки со своими деструкторами (точнее, хотя бы один потомок).

Переопределять чисто виртуальный деструктор в производных классах не обязательно...
Код

class A {
public:
  virtual ~A() = 0;
};

A::~A() {}

class B: public A {};

Это прекрасно компилится.
PM MAIL   Вверх
Fazil6
Дата 17.8.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(zkv @  17.8.2007,  15:38 Найти цитируемый пост)
можно пояснить? Какая реализация, если метод (деструктор) объявлен абстрактным?


оно же не скомпилится если нет реализации. Хоть базовый клас и абстрактный, но при удалении потомка последним должен вызываться деструктор базового, поэтому реализован он должен быть полюбому. Например так
Код

class A
{
public:
virtual ~A() = 0 {} ;
};


Цитата(zkv @  17.8.2007,  15:38 Найти цитируемый пост)
Честно говоря, не сталкивался с применением абстрактных деструкторов...

ну вобщем обычно так делают если класс д.б. абстрактным, но, например, нету других методов виртуальных или все они имеют рееализацию в базовом классе
PM MAIL   Вверх
zkv
Дата 17.8.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



накидал пример
Код

#include <cstdio>

class A 
{
public:
  virtual ~A() = 0;
  virtual int f() = 0;
};

A::~A() {}

int A::f()
{
    return 1;
}

class B: public A 
{
public:
    virtual int f();
};

int B::f()
{
    return 0;
}

int main(int argc, char* argv[])
{
    B b;
    printf( "%d", b.f() ); 
    printf( "%d", b.A::f() ); 
    getc( stdin );
    return 0;
}

выяснилось:
 - объявление метода абстрактным говорит о том, что у него может (я считал, что должно) отсутствовать определение 
 - 
Цитата(sentry @  17.8.2007,  15:39 Найти цитируемый пост)
Переопределять чисто виртуальный деструктор в производных классах не обязательно...
 те не специальные методы переопределять обязательно, а деструктор нет...
а, он (компилятор) его по умолчанию туда затолкает наверное.

Это сообщение отредактировал(а) zkv - 17.8.2007, 15:58
PM MAIL   Вверх
Fazil6
Дата 17.8.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(zkv @  17.8.2007,  15:56 Найти цитируемый пост)
те не специальные методы переопределять обязательно, а деструктор нет...

ну просто компиллятор сам сгенерит деструктор если его нет
PM MAIL   Вверх
sentry
Дата 17.8.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Code Monkey
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.1.2007
Где: Москва

Репутация: 1
Всего: 10



Цитата(Fazil6 @  17.8.2007,  17:30 Найти цитируемый пост)
ну просто компиллятор сам сгенерит деструктор если его нет

Да, компилятор автоматически создает определение деструктора для каждого класса, не имеющего его определения. 
Кстати, именно поэтому производные классы не являются абстрактными.
Насколько я понимаю, чисто виртуальный деструктор нужен только для того, чтобы нельзя было создать экземпляр базового класса. И все.
PM MAIL   Вверх
UnrealMan
Дата 17.8.2007, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Fazil6 @ 17.8.2007,  15:54)
поэтому реализован он должен быть полюбому. Например так
Код

class A
{
public:
virtual ~A() = 0 {} ;
};


Вот так стандарт как раз-таки не разрешает:

Цитата(ISO/IEC 14­882:2003(E) §10.4 Abstract classes)
[Note: a function declaration cannot provide both a pure-specifier and a definition
—end note] [Example:
    struct C {
        virtual void f() = 0 { }; // ill-formed
};


Добавлено через 3 минуты и 36 секунд
Цитата(sentry @  17.8.2007,  16:14 Найти цитируемый пост)
Да, компилятор автоматически создает определение деструктора для каждого класса, не имеющего его определения. 

Не имеющего его объявления smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0889 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.