#c
#c
Вопрос:
У меня такая настройка:
class A
{
public:
virtual void Function();
}
class B : private A
{
}
class C : public B
{
public:
// I want to expose A::Function() here
}
Я попытался сделать это, добавив:
class C : public B
{
public:
virtual void Function();
}
и
C::Function()
{
A::Function();
}
но я получаю ошибку «недоступная база».
Возможно ли сделать что-то подобное?
Ответ №1:
В B
вы можете изменить доступность A::Function
на protected
:
class B : private A
{
protected:
using A::Function;
};
В C::Function
(и в других C
разделах) вам тогда придется ссылаться на функцию как B::Function
, а не A::Function
. Вы также могли бы public: using B::Function;
в C
вместо реализации a, C::Function
который просто вызывает B::Function
.
Ответ №2:
Вы не можете этого сделать. Тот факт, что B
наследуется от A
, является деталью реализации, и вам не разрешено обращаться к нему из C
— точно так же, как вы не можете получить доступ к частным функциям B
или переменным-членам.
Это было бы полностью законно, если бы оно было B
унаследовано protected
или public
от A.
Ответ №3:
Если вы можете изменить это на class B : protected A
, это должно сработать.
Ответ №4:
Не совсем. Сценарий, который вы описываете, указывает на то, что ваша иерархия классов нуждается в переработке.