Considere uma classe base com alguns campos públicos e uma classe derivada que herda a base privadamente e torna um dos campos herdados público por meio da using
declaração. Preciso acessar esse campo público da classe derivada com um ponteiro de membro. Aqui está um código:
#include <iostream>
class Base
{
public:
int derived_public_field = 1;
int derived_private_field = 1;
};
class Derived : private Base
{
public:
using Base::derived_public_field;
};
int main() {
Derived d;
int Derived::* member_ptr = &Derived::derived_public_field;
d.*member_ptr = 2;
std::cout << d.derived_public_field << '\n';
}
Isso não funciona, pois a &Derived::derived_public_field
expressão faz com que o compilador (tentei Clang e GCC) pense que estou tentando acessar uma base inacessível. GCC diz:
error: 'Base' is an inaccessible base of 'Derived'
Eu também tentei isso:
int Base::* member_ptr = &Base::derived_public_field;
o que fez com que o mesmo erro aparecesse mais tarde, quando tentei escrever um valor por meio do ponteiro.
Existe uma maneira de fazer o compilador ver que derived_public_field
é realmente acessível?
&Derived::derived_public_field
é na verdade&Base::derived_public_field
(assim do tipoint Base::*
).Então a conversão de
int Base::*
paraint Derived::*
falha devido ao acesso.Como Eljay propõe no comentário, você pode adicionar um método (estático)
Derived
para contornar isso:Demonstração