Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziedziczenie a dostęp do zmiennych w klasach bazowych i pochodnych.

Ostatnio zmodyfikowano 2018-07-04 13:12
Autor Wiadomość
Puny_mortal
Temat założony przez niniejszego użytkownika
Dziedziczenie a dostęp do zmiennych w klasach bazowych i pochodnych.
» 2018-07-04 09:48:24
Witam,

Już od jakiegoś czasu uczę się C++ i w tej chwili próbuję jak najlepiej zrozumieć pojęcia związane z dziedziczeniem i polimorfizmem. W ramach ćwiczeń postanowiłem stworzyć prosty program. W programie tym jest klasa bazowa i jej podklasy. W każdej klasie (i w bazowej, i w pochodnych) jest zmienna int o tej samej nazwie ("value"). W każdej klasie napisałem konstruktor, który nadaje zmiennej "value" różną wartość w zależności od  klasy - w klasie bazowej konstruktor nadaje "value" wartość 0, a w innych klasach wartościami tymi są różne dodatnie liczby. Z ciekawości chciałem sprawdzić jak da się wyświetlać zmienne w tych klasach za pośrednictwem wskaźników. Zakładając, że klasa bazowa ( z której inne klasy dziedziczą) nazywa się "Bazowa" , a jedna z klas pochodnych nazywa się "Podklasa":

 
C/C++
class Bazowa
{ public:
    int value;
    Bazowa( int w = 0 )
    { value = w; } };

class Podklasa
    : public Bazowa
{ public:
    int value;
    Podklasa( int w = 2 )
    { value = w; } };

Następnie utworzyłem reprezentanta Podklasy o nazwie "subclass" i  wskaźnik Bazowa *wsk1 i próbowałem wyświetlić zmienną value (równą 2) z subclass.

C/C++
Podklasa subclass;
Bazowa * wsk1;
wsk1 = & subclass;

cout << wsk1->value << endl; /*wyswietla 0, czyli value nadawane przez konstruktor klasie bazowej,
a nie value nadawane przez konstruktor klasie pochodnej Podklasa*/

Zauważyłem, że przy innym skonstruowaniu wskaźnika, da się tę wartość wyświetlić:

C/C++
Podklasa subclass;
Podklasa * wsk1;
wsk1 = & subclass;

cout << wsk1->value << endl; /*wyswietla 2, czyli value nadawane przez konstruktor klasie pochodnej,
a nie value nadawane przez konstruktor klasie bazowej*/

Nie rozumiem dlaczego tak się dzieje i czy jest jakiś sposób, aby za pomocą wskaźnika Bazowa *wsk1 uzyskać dostęp do int value u reprezentanta Podklasy (klasa pochodna klasy Bazowa) o nazwie "subclass" ?

Pytanie chyba dla większości osób tutaj, może być banalnie proste, ale ja niestety nie mogę znaleźć klarownego wyjaśnienia (albo czytam i zupełnie nie rozumiem). Czy ma to jakiś związek z wiązaniem dynamicznym i statycznym ? Czy jest to gdzieś łopatologicznie wyjaśnione ? Generalnie chodzi mi o temat dostępu do klas pochodnych do bazowych i na odwrót oraz z klas pochodnych do innych klas pochodnych za pomocą wskaźników i nie tylko. Z góry dziękuję za pomoc.

Pozdrawiam
P-171743
pekfos
» 2018-07-04 13:12:41
Nie rozumiem dlaczego tak się dzieje i czy jest jakiś sposób, aby za pomocą wskaźnika Bazowa *wsk1 uzyskać dostęp do int value u reprezentanta Podklasy (klasa pochodna klasy Bazowa) o nazwie "subclass" ?
Musisz rzutować wskaźnik w dół, do wskaźnika na klasę pochodną. Ze wskaźnika na klasę pochodną możesz odwołać się do obu zmiennych, ze wskaźnika na bazową tylko do jednej.
P-171744
« 1 »
  Strona 1 z 1