У меня есть следующий код в C ++:
#include <iostream>
class Number
{
public:
virtual void foo(){std::cout << "Number foo\n";};
Number (){ std::cout << "Number ctor" << std::endl;}
virtual ~Number(){ std::cout << "Number dtor" << std::endl;}
};
class Complex : public Number
{
public:
virtual void foo(){std::cout << "Complex foo\n";};
Complex (double r=0, double i=0) : _r (r), _i (i)
{ std::cout << "Complex ctor" << std::endl; };
virtual ~Complex(){ std::cout << "Complex dtor" << std::endl;}
private:
double _r,_i;
};
int main()
{
Number *numArr = new Complex [2];
delete [] numArr;
return 0;
}
Когда деструкторы объявляются виртуальными, приложение завершает работу с ошибкой сегментации. Когда он не объявлен как виртуальный, то вызывается деструктор класса Number (что очевидно ...). Но когда деструкторы объявлены как виртуальные, И когда я удаляю двойники в классе Complex, нет ошибки сегментации, и деструкторы вызываются в ожидаемом порядке (Complex, Number), поэтому я предполагаю, что проблема связана к размеру объекта, кто-нибудь может дать мне объяснение?
Спасибо,
Амит.