Como uma classe derivada pode usar um membro protegido da classe base?
Digamos que uma classe baseA
define um membro protegido. Uma classe derivadaB
usa este membro.
class A
{
public:
A(int v) : value(v) { }
protected:
int value;
};
class B : public A
{
public:
B(int v) : A(v) { }
void print() const;
void compare_and_print(const A& other) const;
};
A funçãoB::print
apenas pega o valor do membro atual e o imprime:
void B::print() const
{
std::cout << "Value: " << value << "\n";
}
A outra função membro,B::compare_and_print
, toma uma instância deA
, verifica seus valores e imprime o máximo de ambos:
void B::compare_and_print(const A& other) const
{
auto max_value = std::max(value, other.value);
std::cout << "Max value: " << max_value << "\n";
}
E seother
foram uma instância da classeB
, isso não seria problema. Mas a função gostaria de trabalhar com qualquer tipo deA
instâncias. Infelizmente, isso não é compilado. Isto é o que clang diz sobre isso:
test.cpp:27:42: error: 'value' is a protected member of 'A'
auto max_value = std::max(value, other.value);
^
test.cpp:9:7: note: can only access this member on an object of type 'B'
int value;
^
1 error generated.
Essa restrição parece contra-intuitiva para mim. No entanto, não vou contestar o padrão C ++ sobre isso (no entanto, estou interessado na lógica por trás dessa decisão).
Meu problema é que, no meu projeto, eu realmente tenho esse tipo de caso de uso: Uma classe derivada possui um método que utiliza uma instância da classe base e precisa acessar um membro protegido do objeto recebido.
A solução mais fácil, a que eu implementei atualmente, é adicionar uma função de membro pública à classe base, que retorna o membro protegido. Esta solução não me satisfaz completamente porque gostaria de evitar a exportação do membro dessa maneira.
Como posso ativar o uso do membro protegido da classe base pela classe derivada sem exportar o membro por meio da API?
EDIT: Algumas perguntas relacionadas são:
Acessando membros protegidos em uma classe derivadaComo acessar membros protegidos em uma classe derivada?A resposta que eu gostaria de ter é a explicação de um padrão de design para resolver esse problema sem expor o membro protegido ao código externo (em queexterno significa código que não faz parte da estrutura que define essas classes).
Pode ser que esse padrão não possa existir, eu reconheço.