Почему член базового класса не сохраняет значение, с которым он был инициализирован в конструкторе? - PullRequest
0 голосов
/ 01 февраля 2020
#include <iostream>

using namespace std;
class B {

protected:
    int x;
public:
    B() {
        x = 78;
    }

};
class D1 : virtual public B {
public:
    D1() {
        x = 15;
    }

};
class D2 : virtual public B {
public:
    D2() {
        x = 37;
    }


};
class C : public D2, public D1 {
public:
    int get_x() {
        return x;
    }

};
int main()
{
    C ob;
    cout << ob.get_x();
    return 0;
}

при создании объекта C значение x равно 15 вместо 78. Мне было интересно, потому что последний вызванный конструктор (который изменил значение x) был конструктором D1?

1 Ответ

3 голосов
/ 01 февраля 2020

Мне было интересно, потому что последний вызванный конструктор (который изменил значение x) был конструктором D1?

Да, именно так и произошло. Базовые конструкторы класса вызываются в порядке перечисления предков. Поскольку D1 указан последним, его конструктор называется последним. Сначала вызывается конструктор B' с инициализацией x до 78, затем конструктор D2 перезаписывает x с 37, затем конструктор D1 перезаписывает x с 15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...