Klasy -> dziedziczenie -> wskaźnik klasy bazowej na obiekt pochodny

0

Cześć,

mam do was pytanie o to jak funkcjonują wskaźniki typów bazowych dla klas pochodnych. Wiem, że można je w ten sposób przypisywać i to funkcjonuje ze względu na to, iż obiekt pochodny dziedziczący po bazowym, jest jednocześnie tym drugim.

Ale chyba nie do końca umiem sobie to wyobrazić, bo skoro wskaźnik dla danego typu stanowi o tym ile bajtów od danego miejsca jest zarezerwowane dla obiektu, w takim razie jak to wygląda dla obiektów pochodnych, które przecież zawierają więcej danych niż obiekt bazowy, a więc w efekcie zajmują więcej pamięci? Tak więc jak może funkcjonować poprawnie taki wskaźnik skoro obiekt jest innego rozmiaru?

1
struct A { int X,Y; };
struct B:public A { int Z; }

B b;

Załóżmy że tak się złożyło że obiekt b trafił pod adres 1000.
Ma on rozmiar 12 (=43) bajtów.
Cześć A ma rozmiar 8 (=4
2) bajtów i zajmuje adresy 1000-1007
W tym: X zajmuje adresy 1000-1003, Y zajmuje adresy 1004-1007
Natomiast Z zajmuje adresy 1008-1011
Zaś całość zajmuje adresy 1000-1011

0

to rozumiem, chodzi mi o sytuacje kiedy :

S_bazowa* = new S_pochodna; 
 

bo z tego co czytam to wygląda że można stosować coś takiego, kiedy tworzymy uniwersalny wskaźnik pod którym mogą się znaleźć różne obiekty pochodne.

I tu jest moje pytanie, czy faktycznie można coś takiego stosować. A jeżeli tak, to jak to działa skoro obiekty pochodne mają inny rozmiar niż bazowe, a wskaźnik jest typu bazowego.

1

Oczywiście że można i często stosowane.
Przecież to wskaźnik, można powiedzieć że jest to numer komórki w pamięci gdzie zaczyna się obiekt.
Pamięć jest przydzielona pod pochodną czyli pod tą nie mniejszą, więc wszystko gra.
A to że wskaźnik jest typu bazowego to nic nie szkodzi możemy nadal wywoływać metody wirtualne bądź w każdym momencie skonwertować ten wskaźnik.

0

No tak łapie już, i dobrze rozumiem że nie ma możliwości odwołania się do danych zdefiniowanych wyłącznie w klasie pochodnej, z pod wskaźnika typu bazowego? Czy jakoś się da?

1
struct A { int X,Y; };
struct B:public A { int Z; }
 
A *a=new B;
cout<<((B*)a)->Z<<endl;

O ile wiesz na pewno że ta klasa bazowa wskazuje na konkretny typ pochodni to nie ma problemu.

0

Z tego co mi sie wydaje, to problem bedzie tylko jesli pod wskaznik do klasy A podstawisz adres TABLICY OBIEKTOW KLASY POCHODEJ B bo wtedy wskaznik nie bedzie wiedzial o ile miejsca sie przesunac, aby wskazac na nastepny element, jednak w przypadku pojedynczych elementow nie ma problemu.

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1