Errore del compilatore C2247

'identifier' non accessibile perché 'class' usa 'specifier' per ereditare da 'class'

identifier viene ereditato da una classe dichiarata con accesso privato o protetto.

L'esempio seguente genera l'errore 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

Questo errore può essere generato anche in seguito a operazioni di conformità del compilatore eseguite per Visual Studio .NET 2003: controllo di accesso con membri protetti. È possibile accedere a un membro protetto (n) solo tramite una funzione membro di una classe (B) che eredita dalla classe (A) di cui (n) è membro.

Per il codice valido nelle versioni di Visual Studio .NET 2003 e Visual Studio .NET di Visual C++, dichiarare il membro come amico del tipo. È anche possibile usare l'ereditarietà pubblica.

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

È anche possibile generare C2247 in seguito a operazioni di conformità del compilatore eseguite per Visual Studio .NET 2003: classi base private ora inaccessibili. Una classe (A) che è una classe base privata a un tipo (B) non deve essere accessibile a un tipo (C) che usa B come classe base.

Per il codice valido in entrambe le versioni di Visual Studio .NET 2003 e Visual Studio .NET di Visual C++, usare l'operatore scope.

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