Без использования базового объекта, разрешенного в частном наследовании
Я использую личное наследование, и я удивлен, увидев, что в производном классе использование любого базового объекта не разрешено.
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" ).
Ответы
Ответ 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 Рабочий проект, стандарт для языка программирования С++