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

Без использования базового объекта, разрешенного в частном наследовании

Я использую личное наследование, и я удивлен, увидев, что в производном классе использование любого базового объекта не разрешено.

class A;
class B : private A;
class C : public B;

C::method_1()
{
    A* a; // Temporary "A" object for local computation
}

Это не имеет никакого отношения к наследованию. Я не хочу получать доступ к this->base method!

Эта конфигурация обеспечивает ошибку C2247 в Visual Studio ( "A" недоступна, потому что "B" использует 'private' для наследования от "A" ).

4b9b3361

Ответ 1

Измените это:

A* a;

:

::A* a;

так как C наследует от B и B от A, поэтому вам нужно, чтобы оператор разрешения области выполнял трюк.

Вместо запуска в локальной области, включающей родителей классов, ::A начинает искать глобальную область видимости из-за ::.

Из Стандарт:

11.1.5 Спецификации Acess

В производном классе поиск имени базового класса найдет имя введенного класса вместо имени базового класса в области в котором он был объявлен. Имя введенного класса может быть меньше доступный, чем имя базового класса в области, в которой он был объявлен.

Ответ 2

ISO С++: 11.1 Спецификаторы доступа

5 [Примечание. В производном классе поиск имени базового класса будет определять имя введенного класса вместо имени базового класса в области, в которой он был объявлен. Имя введенного класса может быть менее доступным, чем имя базового класса в области, в которой оно было объявлено. -end note]

И пример из стандарта:

class A { };
class B : private A { };
class C : public B {
    A* p; // error: injected-class-name A is inaccessible
   ::A* q; // OK 
};

N3797 Рабочий проект, стандарт для языка программирования С++