Sdílet prostřednictvím


Chyba kompilátoru C2247

Identifikátor není přístupný, protože třída používá specifikátor k dědění z třídy.

identifier je zděděna z třídy deklarované s privátním nebo chráněným přístupem.

Následující ukázka vygeneruje 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

Tato chyba se dá vygenerovat také v důsledku práce kompilátoru, která byla provedena pro Visual Studio .NET 2003: řízení přístupu s chráněnými členy. K chráněnému členu (n) lze přistupovat pouze prostřednictvím členské funkce třídy (B), která dědí z třídy (A), z níž je (n) členem.

Pro kód, který je platný ve verzích Visual Studio .NET 2003 i Visual Studio .NET sady Visual C++, deklarujte člena jako přítele typu. Lze také použít veřejnou dědičnost.

// 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 lze také vygenerovat v důsledku práce kompilátoru, která byla provedena pro Visual Studio .NET 2003: privátní základní třídy nyní nepřístupné. Třída (A), která je privátní základní třídou typu (B), by neměla být přístupná pro typ (C), který jako základní třídu používá B.

Pro kód, který je platný v sadě Visual Studio .NET 2003 i ve verzích .NET sady Visual C++, použijte operátor oboru.

// 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;
   }
};