Dela via


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