Если вы используете protected
деривацию, класс C
действительно может предоставить доступ к защищенным элементам, создав соответствующую оболочку:
class A {
public:
void F();
};
class B : protected A { };
class C : public B {
public:
using B::F;
};
Это также можно сделать для работы с элементами данных:
class A {
public:
int n;
};
class B : protected A { };
class C : public B {
public:
using B::n;
C() : n(this->B::n) { }
};
С наследованием private
это невозможно напрямую, потому что C
не может сам получить доступ к членам в A
. Однако, если B
получен из A
с использованием наследования private virtual
, это снова становится возможным :
class A {
public:
void F();
};
class B : private virtual A { };
class C : public B, public virtual A { };
int main() {
C x;
x.F();
return 0;
}
Это работает, потому что с наследованием virtual
, C
может быть получен непосредственно из того же экземпляра из A
как B
, но с другим спецификатором доступа.