Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Что это такое и как можно использовать? |
Автор: gr1fon 17.8.2007, 15:05 |
class A { public: virtual ~A() = 0; }; |
Автор: Partizan 17.8.2007, 15:16 |
виртуальные деструкторы используют для того чтобы гарантировать в каждом из наследников реализацию деструктора.... |
Автор: bsa 17.8.2007, 15:21 |
Это абстрактный класс. Он не разрешает создание объектов. Он требует, чтобы были потомки со своими деструкторами (точнее, хотя бы один потомок). |
Автор: Dreamer_0x01 17.8.2007, 15:32 | ||
Как абсолютно правильно уже указали, это абстрактный класс. Запись вида
называется "чисто виртуальной функцией" (pure virtuale). При наличии хотя бы одной такой функции класс становится абстрактным. Это означает, что вы не можете создавать объекты такого класса, а виртуальные функции обязательно должны быть переопределены в производных классах. Однако, вы можете пользоваться указателем на объект такого класса при реализации полиморфности. Деструктор же делается виртуальным для того, чтобы при уничтожении объекта базового класса был вызван деструктор производного класса. |
Автор: zkv 17.8.2007, 15:38 |
можно пояснить? Какая реализация, если метод (деструктор) объявлен абстрактным? Честно говоря, не сталкивался с применением абстрактных деструкторов... |
Автор: Partizan 17.8.2007, 15:39 |
Fazil6, согласен |
Автор: sentry 17.8.2007, 15:39 | ||||||
Переопределять чисто виртуальный деструктор в производных классах не обязательно...
Это прекрасно компилится. |
Автор: Fazil6 17.8.2007, 15:54 | ||||||
оно же не скомпилится если нет реализации. Хоть базовый клас и абстрактный, но при удалении потомка последним должен вызываться деструктор базового, поэтому реализован он должен быть полюбому. Например так
ну вобщем обычно так делают если класс д.б. абстрактным, но, например, нету других методов виртуальных или все они имеют рееализацию в базовом классе |
Автор: zkv 17.8.2007, 15:56 | ||||
накидал пример
выяснилось: - объявление метода абстрактным говорит о том, что у него может (я считал, что должно) отсутствовать определение -
а, он (компилятор) его по умолчанию туда затолкает наверное. |
Автор: Fazil6 17.8.2007, 16:00 | ||
ну просто компиллятор сам сгенерит деструктор если его нет |
Автор: sentry 17.8.2007, 16:14 |
Да, компилятор автоматически создает определение деструктора для каждого класса, не имеющего его определения. Кстати, именно поэтому производные классы не являются абстрактными. Насколько я понимаю, чисто виртуальный деструктор нужен только для того, чтобы нельзя было создать экземпляр базового класса. И все. |
Автор: UnrealMan 17.8.2007, 22:13 | ||||||||
Вот так стандарт как раз-таки не разрешает:
Добавлено через 3 минуты и 36 секунд
Не имеющего его объявления ![]() |