Delen via


Compilerfout C2247

'id' is niet toegankelijk omdat 'klasse' 'specifier' gebruikt om over te nemen van 'klasse'

Opmerkingen

identifier wordt overgenomen van een klasse die is gedeclareerd met privé- of beveiligde toegang.

Voorbeelden

In het volgende voorbeeld wordt C2247 gegenereerd:

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

Deze fout kan ook worden gegenereerd als gevolg van werk van compilercompformance dat is uitgevoerd voor Visual Studio .NET 2003: toegangsbeheer met beveiligde leden. Een beveiligd lid (n) kan alleen worden geopend via een lidfunctie van een klasse (B) die overgaat van de klasse (A) waarvan het lid is (n).

Voor code die geldig is in zowel visual Studio .NET 2003- als Visual Studio .NET-versies van Visual C++, declareert u het lid als een vriend van het type. Openbare overname kan ook worden gebruikt.

// 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 ook worden gegenereerd als gevolg van werk van compilercompformance dat is uitgevoerd voor Visual Studio .NET 2003: privébasisklassen zijn nu niet toegankelijk. Een klasse (A) die een privébasisklasse is voor een type (B) mag niet toegankelijk zijn voor een type (C) dat B als basisklasse gebruikt.

Gebruik de bereikoperator voor code die geldig is in zowel visual Studio .NET 2003 als Visual Studio .NET.NET-versies van 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;
   }
};