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;
}
};