編譯器錯誤 C2247

無法存取 'identifier',因為 'class' 會使用 'specifier' 繼承自 'class'

identifier 繼承自以私用或受保護存取宣告的類別。

下列範例會產生 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

這個錯誤也可能因為針對 Visual Studio .NET 2003:具有受保護成員的存取控制所完成的編譯器一致性工作而產生。 受保護的成員 (n) 只能透過繼承自其 (n) 成員之類別 (A) 的成員函式來存取。

對於 Visual Studio .NET 2003 和 Visual Studio .NET 版本的 Visual C++ 中有效的程式碼,請將成員宣告為類型的 friend。 也可以使用公用繼承。

// 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 完成的編譯器一致性工作而產生:私人基類現在無法存取。 類別 (A) 是類型 (B) 的私人基類,不應該可供使用 B 做為基類的類型 (C) 存取。

對於在 Visual Studio .NET 2003 和 Visual Studio .NET 版本的 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;
   }
};