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?
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?
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;
}
};
Dodanie prefiksu do classname::
.
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
Tak.
Zakwalifikuj swoje połączenie, f()
, z nazwą klasy: SpecificClass::f()
.
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;
};
+2 [Życzę] dla przykładu. –
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.
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
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) –