2015-04-03 2 views
0

чехол-1:Какой из следующих случаев требует виртуального деструктора?

Базовый класс имеет динамически выделенную переменный, но производный класс не делает, а затем я:

Base* p = new Derived; 
delete p; 

чехол-2:

Оба оснований и производный класс имеет динамически распределенные переменные (у производных есть дополнительные динамически распределенные переменные, кроме унаследованных). Опять же, я:

Base* p = new Derived; 
delete p; 

Case-3: Базовый класс не имеет динамически распределяемой переменные, но производный один делает. Я делаю это снова:

Base* p = new Derived; 
delete p; 

Case-4: Ни базовый, ни производный класс не имеет динамически распределенной переменной. Снова я:

Base* p = new Derived; 
delete p; 

Или это вызывает неопределенное поведение во всех случаях, если виртуальное ключевое слово игнорируется?

+0

Как насчет того, чтобы сделать домашнее задание самостоятельно и чему-то научиться? :-) – Waldheinz

ответ

4

Все они.

Если вы используете delete с указателем, который не является тем же самым типом, что и фактический объект, компилятор не знает, как это сделать правильно, если деструктор не является виртуальным. В этот момент вы получаете неопределенное поведение, даже если оно работает правильно.

+0

В общем случае все четыре случая проблематичны, но если динамическое распределение является единственной проблемой, только случаи 2 и 3 являются проблематичными, верно? – Waldheinz

+0

@Waldheinz: Неопределенное поведение всегда вызывает беспокойство, поэтому динамическое распределение не может быть единственной проблемой. –

+0

@MikeSeymour Я не настолько глубоко в C++, чтобы узнать, не определено ли это поведение, потому что C++ говорит об этом или могут быть случаи, когда это действительно безопасно. Но это всегда неопределенно, вот некоторые подробности: http://stackoverflow.com/questions/6171814/why-is-it-undefined-behavior-to-delete-an-array-of-derived-objects-viaa-a- base – Waldheinz

Смежные вопросы