Compilador erro C2247
Mensagem de erro
'identificador' não está acessível porque 'classe' usa o especificador para herdar de 'classe'
identifier é herdada de uma classe declarada com particular ou protegido contra o acesso.
O exemplo a seguir gera 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
Este erro também pode ser gerado sistema autônomo resultado do trabalho de conformidade de compilador que foi concluído 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) do qual ele (n) é um membro.
See Resumo das alterações de quebras de time de compilar para obter mais informações.
Para obter um código que é válido para o Visual Studio .NET 2003 e o Visual Studio .NET versões do Visual C++, declare o membro a ser um amigo do tipo.Herança pública também poderia 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;
}
C2247 também pode ser gerado sistema autônomo resultado do trabalho de conformidade de compilador que foi concluído para o Visual Studio .NET 2003: particulares classes base agora inacessíveis.(B) (C) uma classe (A) que é uma classe base particular para um tipo não deve ser acessível a um tipo que usa B sistema autônomo uma classe base.
Consulte Resumo das alterações de quebra de tempo de Compilar para obter mais informações.
Para obter um código que é válido para o Visual Studio .NET 2003 e o Visual Studio .NET versões 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;
}
};