Описание тега virtual-destructor
A virtual destructor ensures a C++ object will correctly call the destructor of the most-derived class when a polymorphic object is deleted through a pointer to its base class.
4
ответа
Виртуальный деструктор в с ++
В приведенном ниже коде почему ~Derived() деструктор вызывается автоматически? #include<iostream> using namespace std; class Base { public: virtual ~Base() { cout << "Calling ~Base()" << endl; } }; class Derived: public Base { priv…
24 окт '14 в 12:15
3
ответа
COM-подобные интерфейсы предупреждают о не виртуальном деструкторе
Есть ли способ сказать gcc, что компилируемому абстрактному классу не нужен виртуальный деструктор (как никогда не бывает у COM-объектов)? Например, nsISupports всегда жалуется на отсутствующий виртуальный деструктор. Отключение предупреждения не по…
20 июн '09 в 11:16
3
ответа
Почему отсутствие виртуального d-tor в g++ не уничтожает стеков, выделенных членам производного класса?
У меня есть следующий код: struct Message { explicit Message(const std::string& message) : selfMessage(message) {}; ~Message() { std::cerr << "Message: " << selfMessage << std::endl; } const std::string selfMessage; }; struct F…
13 мар '12 в 11:13
3
ответа
Почему деструктор базового класса вызывается для производного объекта, если деструктор производного класса не виртуален?
Почему все деструкторы, ~D(),~C(),~B(),~A() вызывается в примере ниже? Существует только один виртуальный деструктор: A, Вот код: #include<iostream> using namespace std; class A { public: virtual ~A() { cout<<"destruct A\n"; } }; class B…
17 окт '12 в 05:31
4
ответа
Заставить виртуальных деструкторов? C++
Я не видел ответа на этот вопрос в C++ Faq lite: Как определить базовый класс, чтобы каждый наследующий его класс требовал определения деструктора? Я пытался запустить эту программу struct VDtor { virtual ~VDtor()=0; }; struct Test:VDtor { virtual ~…
13 сен '10 в 12:44
4
ответа
Виртуальные деструкторы по умолчанию в C++
У меня есть большой набор унаследованных классов (критериев), которые наследуются от базового класса (критерия). Вот criterionкод class criterion { public: virtual unsigned __int32 getPriorityClass() const = 0; virtual BOOL include(fileData &fil…
05 май '09 в 22:28
1
ответ
Есть ли какой-нибудь вред в переопределении "пустого" виртуального деструктора другим?
Скажем, я наследую от класса с "пустым" виртуальным деструктором: // base.h class Base { public: // ... virtual ~Base(); }; // base.cc Base::~Base() {} Если мне не нужно выполнять какую-либо явную работу в деструкторе производного класса, есть ли вр…
22 дек '15 в 15:26
4
ответа
Требуется ли определение деструктора производного класса, если деструктор базового класса является виртуальным?
Я пытаюсь следующий пример: class base // base class { public: std::list<base*> values; base(){} void initialize(base *b) { values.push_front(b); } virtual ~base() { values.clear(); cout<<"base called"<<endl; } }; class derived : p…
23 апр '12 в 10:55
4
ответа
Исключение с не виртуальным деструктором C++
Когда мы выходим за пределы блока catch, вызывается ли деструктор исключения? (На случай, если мы его не выбрасываем) Предположим, у меня есть класс A, и его деструктор не является виртуальным. B наследует A. Предположим, что некоторая функция броси…
05 фев '15 в 20:48
1
ответ
Применимо ли "правило нуля" к классам с виртуальными методами?
Я считаю, что правило "ноль", упомянутое на слайдах Питера Соммерлада (стр.32), очень убедительно. Хотя, похоже, я помню, что существовало строгое правило, согласно которому нужно определять виртуальный деструктор, если у класса есть виртуальные чле…
07 фев '14 в 20:33
2
ответа
Объявить и реализовать чистый виртуальный деструктор в одну строку?
Я делаю чистый виртуальный деструктор, чтобы заставить класс быть абстрактным, который не содержит методов, кроме ctor. Я делаю это только для реализации заголовка struct abstractSchema { abstractSchema(...): ... { ... } virtual ~abstractSchema() = …
26 апр '13 в 12:52
3
ответа
Деструктор по умолчанию в подклассах базового класса с виртуальным деструктором
У меня есть базовый класс A с виртуальным деструктором. A имеет потомков B а также C которые используют деструктор по умолчанию. Безопасно ли удалять объект C через указатель на A? В частности, рассмотрим этот пример кода: class A { public: A(){}; v…
20 янв '18 в 12:43
6
ответов
Виртуальный деструктор: требуется ли базовый класс, если базовый класс выделяет память динамически?
Этот вопрос выглядит как обсуждение в Виртуальном деструкторе: требуется ли это, когда динамически не выделяется память? В вопросе об экзамене меня спросили: - Что должен определять любой базовый класс, поддерживающий указатели для динамически выдел…
07 сен '12 в 14:30
2
ответа
Как вызвать деструктор из базового класса, который не является виртуальным?
Предположим, у меня есть класс, который наследуется от другого класса, и я создаю указатель от точки базового класса на объект производного класса. Теперь, если деструктор базового класса был определен как виртуальный, он не будет создавать никаких …
19 янв '14 в 08:02
1
ответ
Правильное размещение для чистого виртуального деструктора по умолчанию в C++11
У меня есть интерфейсный класс, но я хочу, чтобы все производные классы реализовали виртуальный деструктор: // Interface.h class Interface { virtual ~Interface() = 0; }; Interface::~Interface() = default; Проблема в том, что в этом случае у меня оши…
13 апр '17 в 08:19
6
ответов
C++ Виртуальный разрушитель Crash
У меня есть следующая иерархия классов: class Base { public: virtual ~Base(); }; class Derived : public Base { public: virtual ~Derived(); }; class MoreDerived : public Derived { public: virtual ~MoreDerived(); }; вместе с объектами Base* base = new…
17 сен '10 в 16:04
3
ответа
C++ Ошибка при использовании виртуального деструктора
Я реализовал интерфейс: class ISolution { public: virtual ~ISolution() = 0; virtual void resultat() = 0; }; и некоторые производные классы от него: class SolX : ISolution { private: int member; MyClass myOb; public: SolX(const MyClass& inOb) : m…
06 май '14 в 12:44
2
ответа
Вызов унаследованного IUnknown::Release() в деструкторе
Почему вызов унаследованной функции IUnknown::Release() для объекта IWICImagingFactory в деструкторе приводит к тому, что "CXX0030: Ошибка: выражение не может быть оценено" отображается для каждой записи в таблице виртуальных функций объекта (__vfpt…
03 окт '11 в 07:18
5
ответов
Виртуальный деструктор при использовании апкастинга
Все говорят, что деструктор должен быть виртуальным, когда хотя бы один из методов класса является виртуальным.Мои вопросы: не правильно ли говорить, что деструктор должен быть виртуальным при использовании апкастинга? class A { public: ~A(){ cout &…
13 май '11 в 12:40
2
ответа
Могут ли виртуальные функции быть встроенными
Если я определю класс следующим образом: class A{ public: A(){} virtual ~A(){} virtual void func(){} }; Означает ли это, что виртуальный деструктор и func встроены
25 авг '13 в 18:04