В глобальной области видимости B не отображается как A из-за защищенного наследования.
Только сам класс B, классы, унаследованные от B, и класс C (потому что отношение дружбы) "знают", что B наследуетО. Но остальной мир (включая глобальную область видимости) этого не делает.
Таким образом, чтобы достичь того, что вы хотите, вы можете назвать
c.foo(&b)
в области действия C, например, с помощью некоторой оболочкифункция, что-то вроде (хотя и плохое дизайнерское решение):
#include <iostream>
#include <cstdlib>
class C;
class A {
friend class C; // this does not help
};
class B : protected A {
friend class C; // this does not help either
};
class C {
public:
void foo() {
B b;
foo(&b); // this call is OK within C-scope
}
private:
void foo(A* /*a*/) {
std::cout << "C::foo(A* a)\n";
};
};
int main()
{
std::cout << "Hello, Wandbox!" << std::endl;
B b;
C c;
//c.foo(&b); // this produces error: class A is an inaccessible base of B
c.foo(); // this is calling c.foo(A*) internally
}
или live :