2013-08-05 4 views
1

Я использую компилятор GNU. Виртуальный деструктор в классе B не вызывает Destructor ~ D(). Может ли кто-нибудь сказать мне, почему?Виртуальный деструктор: не работает?

#include<iostream> 
using namespace std; 

class B { 
    double* pd; 
    public: 
    B() { 
    pd=new double [20]; 
    cout<< "20 doubles allocated\n"; 
    } 

    virtual ~B() { //the virtual destructor is not calling ~D() 
    delete[] pd; 
    cout<<"20 doubles deleted\n"; 
    } 

    }; 

class D: public B { 
    int* pi; 
    public: 
    D():B() { 
    pi= new int [1000]; 
    cout<< "1000 ints allocated\n"; 
    } 
    ~D() { 
    delete[] pi; 
    cout< "1000 ints deleted\n"; 
    } 
    }; 

int main() { 
    B* p= new D; //new constructs a D object 

Удалить должен вызвать виртуальный деструктор в классе B, но это не так.

delete p; 
    } 
+1

'cout <" 1000 ints deleted \ n ";' у вас есть опечатка – Borgleader

+0

Это должно сработать (если оно скомпилировано, у вас есть тривиальная синтаксическая ошибка). Какие у вас есть доказательства, которых нет? – juanchopanza

+0

Спасибо, ребята. –

ответ

8

Это делает, вы просто не видите выхода, потому что у вас есть опечатка:

cout < "1000 ints deleted\n"; 
// ^, less than 

Ваш компилятор слишком разрешительный, это не должно компилировать (по крайней мере в C++ 11).

Это, вероятно, делает потому, что basic_ios::operator void* делает объект потока неявно раскладывающийся в void* и ваш компилятор позволяет строковый литерал к распаду на char* (который конвертируется в void*). cout < "x";, то просто сравнение указателей с использованием встроенного operator<(void*, void*) и выбрасывает результат.

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