컴파일러 오류 C2247
'class'는 'specifier'를 사용하여 'class'에서 상속하기 때문에 'identifier'에 액세스할 수 없습니다.
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)에서 상속되는 클래스(B)의 멤버 함수를 통해서만 액세스할 수 있습니다.
Visual Studio .NET 2003 및 Visual Studio .NET 버전의 Visual C++에서 모두 유효한 코드의 경우 멤버를 형식의 친구로 선언합니다. 공용 상속도 사용할 수 있습니다.
// 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;
}
Visual Studio .NET 2003에 대해 수행된 컴파일러 규칙 작업의 결과로 C2247을 생성할 수도 있습니다. 이제 프라이빗 기본 클래스에 액세스할 수 없습니다. B 형식에 대한 프라이빗 기본 클래스인 클래스(A)는 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;
}
};