Как пропустить класс с открытым доступом к функции?

#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:

Не совсем. Сценарий, который вы описываете, указывает на то, что ваша иерархия классов нуждается в переработке.