2010-04-13 26 views
10

W C++ można umieścić członka w klasie bazowej i członka o tej samej nazwie w odziedziczonej klasie.Dziedziczona klasa C++ ma członka o tej samej nazwie

Jak uzyskać dostęp do określonego w odziedziczonej klasie?

+3

Pytanie, które należy zadać, brzmi: dlaczego masz zajęcia w tej samej hierarchii dziedziczenia, które mają duplikat nazwanych członków, którzy są różni? Zobacz Effective C++ Item 33. – TheJuice

+0

Jeśli masz pytanie, w jaki sposób uzyskać dostęp do metody pochodnej z bazowego odniesienia lub wskaźnika, dodaj komentarz. Jak jest napisane, pytanie może być interpretowane na dwa sposoby (i wszystkie odpowiedzi dotyczą tylko jednego z nich) –

Odpowiedz

24

W takim przypadku należy w pełni zakwalifikować nazwę członka.

class A 
{ 
public: 
    int x; 
}; 


class B : public A 
{ 
public: 
    int x; 
    B() 
    { 
    x = 0; 
    A::x = 1; 
    } 
}; 
2

Dodanie prefiksu do classname::.

7

Jeśli określisz nazwę, automatycznie uzyskasz dostęp do tej z dziedziczonej klasy. Jeśli masz na myśli sposób dostępu do tego w klasie bazowej, użyj Base :: member

3

Tak.

Zakwalifikuj swoje połączenie, f(), z nazwą klasy: SpecificClass::f().

6

Aby uzyskać dostęp do ukrytego elementu w klasie bazowej, należy poprzedzić nazwę elementu nazwą klasy podstawowej. Patrz poniżej:

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; 
}; 
+0

+2 [Życzę] dla przykładu. –

3

Jedno podejście (już wspomniano we wszystkich innych wskazań) jest użycie kwalifikowanej nazwy użytkownika, jak Base::member. Może być używany w połączeniu z jawnym dostępem poprzez wskaźnik this, jeśli jest to Twój styl: this->Base::member.

Innym podejściem jest wykonanie dostępu za pomocą wskaźnika this jawnie przekonwertowanego na typ klasy bazowej: ((Base *) this)->member.

Oczywiście, powyższe odniesienia do wskaźnika this są dokonywane przy założeniu, że próbujesz uzyskać dostęp do elementu z poziomu jakiejś niestatecznej funkcji składowej klasy. Aby uzyskać dostęp z "zewnątrz", te same triki można zastosować do dowolnego innego wskaźnika (lub odniesienia): some_pointer->Base::member lub ((Base *) some_pointer)->member.

Dla członków danych te dwa podejścia są równoważne. W przypadku funkcji składowych mogą prowadzić do różnych wyników przy użyciu funkcji wirtualnych. Z tego względu na ogół preferowane powinno być pierwsze podejście.

Powiązane problemy