Erro do compilador C2247
'identifier' não acessível porque 'class' usa 'specifier' para herdar de 'class'
identifier
é herdado de uma classe declarada com acesso particular ou protegido.
O exemplo a seguir gera o erro 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
Esse erro também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio .NET 2003: controle de acesso com membros protegidos. Um membro protegido (n) só pode ser acessado através de uma função de membro de uma classe (B) que herda da classe (A) da qual (n) é um membro.
Para o código válido nas versões do Visual Studio .NET 2003 e do Visual Studio .NET do Visual C++, declare o membro como um amigo do tipo. A herança pública também pode ser usada.
// 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;
}
O C2247 também pode ser gerado como resultado do trabalho de conformidade do compilador que foi feito para o Visual Studio .NET 2003: classes base privadas agora inacessíveis. Uma classe (A) que é uma classe base privada para um tipo (B) não deve ser acessível a um tipo (C) que usa B como uma classe base.
Para que o código seja válido nas versões do Visual Studio .NET 2003 e do Visual Studio .NET do Visual C++, use o operador de escopo.
// 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;
}
};