Błąd kompilatora C2247

"identyfikator" jest niedostępny, ponieważ "klasa" używa specyfikatora do dziedziczenia po "klasie"

identifier jest dziedziczony z klasy zadeklarowanej z dostępem prywatnym lub chronionym.

Poniższy przykład generuje C2247:

// C2247.cpp
class A {
public:
   int i;
};
class B : private A {};    // B inherits a private A
class C : public B {} c;   // so even though C's B is public
int j = c.i;               // C2247, i not accessible

Ten błąd można również wygenerować w wyniku pracy zgodności kompilatora, która została wykonana dla programu Visual Studio .NET 2003: kontrola dostępu z chronionymi elementami członkowskimi. Dostęp do chronionego elementu członkowskiego (n) można uzyskać tylko za pośrednictwem funkcji składowej klasy (B), która dziedziczy z klasy (A), z której (n) jest składową.

W przypadku kodu, który jest prawidłowy zarówno w wersjach Visual Studio .NET 2003, jak i Visual Studio .NET programu Visual C++, zadeklaruj element członkowski jako znajomy tego typu. Można również użyć dziedziczenia publicznego.

// C2247b.cpp
// compile with: /c
// C2247 expected
class A {
public:
   void f();
   int n;
};

class B: protected A {
   // Uncomment the following line to resolve.
   // friend void A::f();
};

void A::f() {
   B b;
   b.n;
}

C2247 można również wygenerować w wyniku pracy kompilatora zgodności, która została wykonana dla programu Visual Studio .NET 2003: prywatne klasy bazowe są teraz niedostępne. Klasa (A) będąca prywatną klasą bazową typu (B) nie powinna być dostępna dla typu (C), który używa B jako klasy bazowej.

W przypadku kodu, który jest prawidłowy zarówno w wersjach Visual Studio .NET 2003, jak i Visual Studio .NET visual C++, użyj operatora zakresu.

// C2247c.cpp
// compile with: /c
struct A {};

struct B: private A {};

struct C : B {
   void f() {
      A *p1 = (A*) this;   // C2247
      // try the following line instead
      // ::A *p2 = (::A*) this;
   }
};