Kompilatorfel C2247

"identifierare" är inte tillgänglig eftersom "klass" använder "specificerare" för att ärva från "klass"

Anmärkningar

identifier ärvs från en klass som deklarerats med privat eller skyddad åtkomst.

Examples

I följande exempel genereras 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

Det här felet kan också genereras som ett resultat av kompilatorns efterlevnadsarbete som utfördes för Visual Studio .NET 2003: åtkomstkontroll med skyddade medlemmar. En skyddad medlem (n) kan endast nås via en medlemsfunktion i en klass (B) som ärver från klassen (A) som den (n) är medlem i.

För kod som är giltig i både Visual Studio .NET 2003- och Visual Studio .NET-versionerna av Visual C++, deklarerar du medlemmen som en vän av typen. Offentligt arv kan också användas.

// 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 kan också genereras som ett resultat av kompilatorns överensstämmelsearbete som utfördes för Visual Studio .NET 2003: privata basklasser är nu otillgängliga. En klass (A) som är en privat basklass till en typ (B) bör inte vara tillgänglig för en typ (C) som använder B som basklass.

Använd omfångsoperatorn för kod som är giltig i både Visual Studio .NET 2003- och Visual Studio .NET-versionerna av Visual C++.

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