2014-01-25 4 views
-2

У меня есть код, который идти как этотC++ конструктор класса и деструктор

class A_ 
{ 
    public: 
    int k; 

    A_(int a):k(a) 
    {cout<<"A_'s constructor called"<<endl; 
    } 

    virtual ~A_() 
    { 
    cout<<"class A_ destructor"<<endl; 
    } 
virtual void getval() { cout<<k<<endl;} 

}; 

class A : public A_ 
{ 
    public: 
    int m; 
    A(int a):A_(2),m(a){cout<<"A's constructor called"<<endl;} 
    virtual void getval() 
    { 
    cout<<"m is "<<m<<endl; 
    } 
    ~A() 
    { 
    cout<<"class A destructor"<<endl; 
    } 
}; 
int main() 
{ 
    A A1(1); 
    A_(2); 
    cin.get(); 
    } 

Когда я запускаю этот код, я получаю результат, который идет как это (программа достигнутую до cin.get())

A_'s constructor called

A's constructor called

A_'s constructor called

class A_ destructor

Я ожидала, что объект A_, созданный в рамках класса А должны быть уничтожены сразу же, как в случае, когда A_(2) в main() выполняется, но это не происходит. Объект A_ уничтожается только тогда, когда программа доходит до конца (после ввода текста в качестве входных данных)

class A destructor

class A_ destructor

Вопрос:

1) Почему объект A_ класса создан вместе с A объект не сразу уничтожается?

2) Есть ли обстоятельства, когда объект базового класса вызывает метод производного класса? В частности, существует возможность для объекта A_ позвонить по телефону getval() объекта A?

+0

Знаете ли вы, что такое наследование и как оно работает? Чтобы ответить на ваш второй вопрос - да, именно на этом основан полиморфизм. – littleadv

+0

@littleadv. Вы правы, мое понимание наследования не было полным, я думал, что объект базового класса создается в объекте производного класса, мне не приходило в голову, что конструктор базового класса требуется для инициализации производной формы элементов данных базовый класс. Спасибо за подсказку. – Gautam

ответ

0

Ответ имеет три причины.

  1. Деструкторы вызываются в порядке FILO/стек (сначала в последнем случае).

  2. Сфера применения. В вашем случае единственной областью является основная функция

  3. Наследование. A наследуется от A_.

Если вы думаете об этом, для того, чтобы объект типа «А», который будет создан, он должен прежде всего знать, что наследовать от «A_». Поэтому сначала создается A_, затем A. Затем, конечно, выполняется ваша строка «A_ (2)», в результате чего второй вызов конструктора A_.

Затем, поскольку область действия закончена, деструктор вызывается в обратном порядке. A_ (2) уничтожается, тогда A (1), затем A_, которое A (1) унаследовано от.

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