Форум программистов, компьютерный форум CyberForum.ru

Вызов конструкторов/деструкторов при наследовании - C++

Восстановить пароль Регистрация
 
BF_
3 / 3 / 1
Регистрация: 07.09.2013
Сообщений: 68
24.06.2014, 19:51     Вызов конструкторов/деструкторов при наследовании #1
Объясните пожалуйста, как получается вывод на экран 2531

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
class A
{
public:
    A(int n = 2) : m_i(n) { }
 
    ~A() { std::cout << m_i; }
 
protected:
    int m_i;
};
 
class B
    : public A
{
public:
    B(int n) : m_a1(m_i + 1), m_a2(n) { }
 
public:
    ~B()
    {
        std::cout << m_i;
        --m_i;
    }
 
private:
    A m_a1;
    A m_a2;
};
 
int main()
{
    { B b(5); }
 
    std::cout << std::endl;
 
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 19:51     Вызов конструкторов/деструкторов при наследовании
Посмотрите здесь:

C++ Оценить правильность использования конструкторов, деструкторов в коде
Порядок вызова конструкторов при множественном наследовании C++
C++ Правильное использование конструкторов и деструкторов
C++ Непонятный вызов Деструкторов при создании списка
Разработка классов, создание конструкторов и деструкторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,202
24.06.2014, 20:14     Вызов конструкторов/деструкторов при наследовании #2
B b(5).
Здесь создается объект класса B. Вызывается конструктор B(int), который вызывает конструктор A() с n=2, инициализирует m_i=2, затем создает объекты-члены m_a1 и m_a2 со значениями m_i 3 и 5 соответственно.

теперь объект выходит из области видимости и уничтожается. Вызывается деструктор b, который выводит значение m_i=2 и уменьшает m_i на 1. дальше уничтожаются объекты члены m_a2 и m_a1 и выводятся их значения m_i (5 и 3). И в конце т.к. B наследуется от A будет вызван деструктор A который выведет значение m_i (после уменьшения в ~B = 1)
BF_
3 / 3 / 1
Регистрация: 07.09.2013
Сообщений: 68
24.06.2014, 20:22  [ТС]     Вызов конструкторов/деструкторов при наследовании #3
Jewbacabra, все понятно, кроме этого: в каком месте выводятся m_a2 и m_a1 ?
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,202
24.06.2014, 20:29     Вызов конструкторов/деструкторов при наследовании #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
BF_, выводятся не m_a2 и m_a1 а их m_i.
m_a1 и m_a2 это ведь объекты класса A(28 и 29 строчка)
эти объекты создаются при создании объектов B (18 строчка)
при уничтожении B m_a1 и m_a2 тоже должны быть уничтожены, т.к. они являются объектами класса A будет вызван деструктор, внутри которого осуществляется вывод m_i (8 строчка)
BF_
3 / 3 / 1
Регистрация: 07.09.2013
Сообщений: 68
24.06.2014, 20:33  [ТС]     Вызов конструкторов/деструкторов при наследовании #5
Jewbacabra, спасибо огромное, я все понял
Yandex
Объявления
24.06.2014, 20:33     Вызов конструкторов/деструкторов при наследовании
Ответ Создать тему
Опции темы

Текущее время: 13:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru