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

Klasy -> dziedziczenie -> wskaźnik klasy bazowej na obiekt pochodny
N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
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?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
0

to rozumiem, chodzi mi o sytuacje kiedy :

Kopiuj
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.

edytowany 1x, ostatnio: No0b_
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
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?

n0name_l
Mozesz (legalnie) sie odwolywac do tego co zostalo zadeklarowane w klasie bazowej.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
1
Kopiuj
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
rizon
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 3 lata
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

n0name_l
wtedy wyjdzie mniej wiecej cos takiego: http://ideone.com/soJur9
_13th_Dragon
Absolutnie bezsensowny przykład, owszem jak strzelisz sobie w kolano to będzie boleć.
n0name_l
Jesli potwierdzenie tego: "Z tego co mi sie wydaje, to problem bedzie tylko jesli pod wskaznik do klasy A podstawisz adres TABLICY OBIEKTOW KLASY POCHODEJ B" jest dla Ciebie kompletnie bezsensowna, to co ma sens?
_13th_Dragon
Zastanów się masz już tablice obiektów pochodnych. Po kiego masz konwertować adres pierwszego elementu na klasę bazową. Absolutnie niczego tym nie zyskasz.
n0name_l
To byla ilustracja powyzszych slow...
_13th_Dragon
@n0name_l, wydaje mi się że kompletnie cię nie rozumiem.
rizon
@n0name_l, ja też nie wiem jak się ustosunkować do Twoich komentarzy, bo również ich nie rozumiem
n0name_l
Napisales (tu cytat) "Z tego co mi sie wydaje", a w powszechnie rozumianym jezyku polskim nie jest to synonim slow "dalbym sobie glowe uciac", wiec: skleilem ten krotki kawalek kodu, zeby potwierdzic Twoje przekonanie, co do: "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,". Przyklad co prawda ilustrowal to malo zgrabnie, ale mysle, ze szlo sie domyslic, ze wskaznik przesuwa sie o 8 bajtow, zamiast 12 bajtow.
rizon
Ok, teraz rozumiem, dzięki za ułatwienie interpretacji. Pozdrawiam!
_13th_Dragon
Mój pierwszy komentarz, dotyczył postu a nie do twojego komentarzu.
n0name_l
To wiele tlumaczy :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.