Конструктор базового класса не запущен - PullRequest
0 голосов
/ 26 ноября 2011
#define CLASS(ID) class ID{ \
    public: \
            ID(int) { cout<<#ID <<"\tconstructor"<<endl; } \
           ~ID(){cout<<#ID<<"\tDestroyed  "<<endl;} \
};
CLASS(Base);
CLASS(Member);

class Derived : public Base {
    public:
        Member *mem;
        Derived(int x) : Base(1) {
            cout<<"Derived constructor"<<endl;
            mem=new Member(2);
        }
        ~Derived()
        {
            cout<<"Derived Destroyed"<<endl;
            delete mem;
        }
};

int main(int argc, char** argv) {
    Derived * der=new Derived(1);
    cout<<"****"<<endl;
    delete der;
}

Вывод этого:

Derived constructor
Member  constructor
****
Derived Destroyed
Member  Destroyed  
Base    Destroyed

Во второй версии:

class Derived : public Base {
    public:
        Member *mem;
        Derived(int x) : Base(1) {
            cout<<"Derived constructor"<<endl;
        }

        ~Derived()
        {
            cout<<"Derived Destroyed"<<endl;
            delete mem;
        }
};

Почему в первой версии конструктор Base не выполняется, когда экземпляриз того же класса был создан экземпляр?

1 Ответ

1 голос
/ 26 ноября 2011

На GCC версии 4.6 я получил это

Base    constructor
Derived constructor
Member  constructor
****
Derived Destroyed
Member  Destroyed  
Base    Destroyed  

Так что, похоже, он работает

На заметку о том, что ваш базовый деструктор должен быть виртуальным

 virtual ~ID(){}

таким образом, когда у вас есть только ссылка на базу, которую вы получили, она все равно будет чисто удалена.

В примечании, пожалуйста, не используйте определения, подобные этому, если у вас нет, также оборачивая mem в смарт.точка тоже хорошая идея.Как auto_ptr в c ++ 98 (в идеале, ptrs boost) или unique_ptr в c ++ 11.

...