Виртуальное наследование и одноименные члены - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть следующие классы:

class Base
{
public:
    Base() { x = 3; }
    int x;
    virtual void foo() {};
};

class Med1 : public virtual Base
{
public:
    int x;
    Med1() { x = 4; }
    virtual void foo() {};
};

class Med2 : public virtual Base
{
public:
    virtual void goo() {};
    virtual void foo() {};
};

class Der : public Med1, public Med2
{
public:
    Der() {}
    virtual void foo() {};
    virtual void goo() {};
};

И следующий код:

Base* d = new Der;
d->foo();
cout << d->x;

Выход:

 3

Почему это? Med1 конструктор вызывается после Base конструктора. Я предполагаю, что он устанавливает Med1::x, а не Base::x, но почему Der::x совпадает с Base::x, а не Med1::x. Почему нет двусмысленности?

Ответы [ 3 ]

1 голос
/ 27 февраля 2012

d - указатель на Base, поэтому d->x однозначно относится к Base::x. Была бы только двусмысленность, если бы это был указатель на Der.

0 голосов
/ 27 февраля 2012

Поскольку указатель на Base x будет Base. И порядок конструктора суперкласс, а затем производный класс. Итак, конструктор базового класса вызывается сначала, а затем из Der.

0 голосов
/ 27 февраля 2012

Переменная x не является виртуальной, поэтому компилятор должен почесать голову и сказать - повесить на вас базу. Таким образом, это идет к Base->x

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