Множественное наследование: одно имя переменной
class A
{
protected:
string word;
};
class B
{
protected:
string word;
};
class Derived: public A, public B
{
};
Как повлияет доступность переменной word
в Derived
? Как я могу его решить?
Ответы
Ответ 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;
}
};