C ++ classe ereditata ha membro della omonima
Domanda
In C ++ si può mettere un membro in una classe base e un membro con lo stesso nome nella classe ereditata.
Come posso accedere ad una specifica uno nella classe ereditata?
Soluzione
In questo caso si dovrebbe qualificare completamente un nome utente.
class A
{
public:
int x;
};
class B : public A
{
public:
int x;
B()
{
x = 0;
A::x = 1;
}
};
Altri suggerimenti
Se si specifica il nome potrete accedere quello nella classe ereditata automaticamente. Se vuoi dire come si fa a accedere quello nella classe base, utilizzare Base :: membro
Per accedere al membro nascosto nella classe di base è necessario anteporre il nome del membro con il nome della classe di base. Vedi sotto:
class A
{
protected:
int i;
};
class B : public A
{
public:
void foo( void )
{
int a_i = A::i;
int b_i = i;
int b_i_as_well = B::i;
}
private:
int i;
};
Sì.
Qualificare la vostra chiamata, f()
, con un nome di classe:. SpecificClass::f()
Con il prefisso con classname::
.
Un approccio (già citato in tutte le altre risposte) è quello di utilizzare il nome del membro qualificato, come Base::member
. Può essere utilizzato in combinazione con accesso esplicito tramite puntatore this
, se questo è il tuo stile:. this->Base::member
Un altro approccio è quello di eseguire l'accesso attraverso puntatore this
esplicitamente convertito nel tipo di classe di base:. ((Base *) this)->member
Naturalmente, i riferimenti di cui sopra al puntatore this
sono fatte sotto presupposto che si sta tentando di accedere al membro all'interno di una funzione membro non statico della classe. Per l'accesso, se da "fuori", gli stessi trucchi possono essere applicati a qualsiasi altro puntatore (o di riferimento): some_pointer->Base::member
o ((Base *) some_pointer)->member
Per i membri di dati questi due approcci sono equivalenti. Per funzioni membro possono portare a risultati diversi con funzioni virtuali. Per questo motivo, in generale, il primo approccio dovrebbe essere preferito.
#include <iostream>
using namespace std;
struct Base {
int memfcn();
};
struct Derived : Base {
int memfcn(int);
};
int main() {
Derived d;
Base b;
d.Base::memfcn(); //you can even use :: in conjunction with dot(.). This is new to me.
}