Aracılığıyla paylaş


Derleyici Hatası C2247

'class', 'class' öğesinden devralmak için 'tanımlayıcı' kullandığından 'identifier' erişilebilir değil

identifier özel veya korumalı erişimle bildirilen bir sınıftan devralınır.

Aşağıdaki örnek C2247 oluşturur:

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

Bu hata, Visual Studio .NET 2003: korumalı üyelerle erişim denetimi için yapılan derleyici uyumluluğu çalışmasının bir sonucu olarak da oluşturulabilir. Korunan üyeye (n) yalnızca (n) üyesi olduğu sınıftan (A) devralan bir sınıfın (B) üye işlevi aracılığıyla erişilebilir.

Visual C++'ın hem Visual Studio .NET 2003 hem de Visual Studio .NET sürümlerinde geçerli olan kodlar için, üyeyi türünün arkadaşı olarak bildirin. Genel devralma da kullanılabilir.

// 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, Visual Studio .NET 2003 için yapılan derleyici uyumluluğu çalışmalarının sonucu olarak da oluşturulabilir: özel temel sınıflara artık erişilemez. (B) türüne özel bir temel sınıf olan bir sınıf (A), temel sınıf olarak B kullanan bir tür (C) için erişilebilir olmamalıdır.

Visual C++'ın hem Visual Studio .NET 2003 hem de Visual Studio .NET sürümlerinde geçerli olan kod için kapsam işlecini kullanın.

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