Em C++ uma classe pode ser declarada dentro do escopo de outra classe, essa prática é conhecida como: “classes aninhadas”.
Classes aninhadas são consideradas dentro do escopo da classe envolvente e estão disponíveis para uso dentro desse escopo. Para se referir a uma classe aninhada de um escopo diferente do seu escopo envolvente imediato, você deve usar um nome totalmente qualificado.
Veja esse exemplo, onde a class B
está dentro da classe A
. Podemos tanto criar o objeto da classe A
como também criar um objeto da classe B
utilizado a resolução de escopo da classe A
.
#include <iostream>
class A {
public:
class B {
public:
B(){}
void print(){
std::cout << "Eu sou B\n";
}
};
};
int main(){
A::B b;
b.print();
}
Os membros e funções-membro são intercambiáveis entre essas duas classes, e os mesmos podem ser sobrecarregados. Por exemplo, se tivéssemos uma função-membro de mesmo nome e tipo em A
, eu poderia utilizá-la sem nenhum problema:
#include <iostream>
class A {
public:
void print(){
std::cout << "Eu sou A\n";
}
class B {
public:
B(){}
void print(){
std::cout << "Eu sou B\n";
}
};
};
int main(){
A a;
a.print();
A::B b;
b.print();
}
E lógico, os privilégios de acesso também se mantém, se uma dessas funções-membro fosse private
, a regra de não acesso se mantém.
O principal motivo de usar classes aninhadas é justamente pelo fato de ocultar dados, ou seja, sabe aquelas API’s públicas que você pode instanciar uma classe através de uma URL? Então, elas fazem uso de classes aninhadas, e lógico, com todas as medidas de proteção de dados também, além de não poluírem o namespace
.
Para mais informações sobre classes aninhadas acesse: