Подтвердить что ты не робот

Множественное наследование: одно имя переменной

class A
{
   protected:
    string word;
};

class B
{
   protected:
    string word;
};

class Derived: public A, public B
{

};

Как повлияет доступность переменной word в Derived? Как я могу его решить?

4b9b3361

Ответ 1

Он будет неоднозначным, и вы получите сообщение об ошибке компиляции.

Чтобы использовать его, вам нужно использовать правильную область:

 class Derived: public A, public B
{
    Derived()
    {
        A::word = "A!";
        B::word = "B!!";
    }
};

Ответ 2

Вы можете использовать ключевое слово using, чтобы сообщить компилятору, какую версию использовать:

class Derived : public A, public B
{
protected:
    using A::word;
};

Это говорит компилятору, что класс Derived имеет защищенный член word, который будет псевдонимом A::word. Тогда всякий раз, когда вы используете неквалифицированный идентификатор word в классе Derived, это будет означать A::word. Если вы хотите использовать B::word, вам необходимо полностью определить область действия.

Ответ 3

В вашем классе Derived будут две переменные, B::word и A::word Вне Derived вы можете получить к ним доступ как это (если вы измените свой доступ к публике):

Derived c;
c.A::word = "hi";
c.B::word = "happy";

Попытка получить доступ к c.word приведет к ошибке, так как нет поля с именем word, но только A:: word и B:: word.

Внутри Derived они ведут себя как обычные поля, опять же, с именами A::var и B::var, также упомянутыми в других ответах.

Ответ 4

При доступе к word в классе Derived вам нужно было объявить

class Derived: public A, public B
{
    Derived()
    {
       A::word = X;
       //or
       B::word = x;
    }
};