Рассмотрим следующий код:
class A
{
public:
A() {}
~A() {}
};
class B: public A
{
B() {}
~B() {}
};
A* b = new B;
delete b; // undefined behaviour
Я понимаю, что стандарт С++ говорит, что удаление b - это поведение undefined - то есть, все может случиться. Но в реальном мире, мой опыт заключается в том, что ~ A() вызывается всегда, и память правильно освобождена.
если B вводит какие-либо члены класса со своими собственными деструкторами, они не будут вызваны, но меня интересует только простой вид выше, где наследование используется, возможно, для исправления ошибки в одном методе класса, для которого исходный код недоступен.
Очевидно, это не будет то, что вы хотите в нетривиальных случаях, но оно по крайней мере непротиворечиво. Знаете ли вы о какой-либо реализации на С++, где выше не выполняется, для показанного кода?