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?

È stato utile?

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.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top