[c++] lista z wlasnymi obiektami + dziedziczenie

0

Witam

Mam do rozwiazania pewien problem ale zatrzymalem sie na taki zagadnieniu otoz:

Mamy

class A{

.....
}
class B: public A{

....
}

teraz gdzies w programie ma miejste taka sytuacja

list<B> mylist;
A objekt;
mylist.push_back(A);

I stad moje pytanie skoro obiekt B dziedziczy po A to jest tez obiektem A 'po czesci' i stad moje pytanie czy mozna wykonac jakis myk by dodawac obiekty bazowe do listy ktora ma zadeklarowane przechowywac jakis obiekt dziedziczacy??</b>

0

jeśli chcesz skorzystać z dobrodziejstw polimorfizmu t w tej liście MUSZĄ być wskaźniki (lub obiekty pełniące ich rolę).

0
MarekR22 napisał(a)

jeśli chcesz skorzystać z dobrodziejstw polimorfizmu t w tej liście MUSZĄ być wskaźniki (lub obiekty pełniące ich rolę).

dokładnie, tylko uwaga na "pułapkę" w postaci funkcji wirtualnych,

class A {
 virtual void cos();
};

class B : public A {
 virtual void cos();
};

zadziała inaczej niż dla i bez virtual:

A* b = new B();
b->cos();
0

To jest źle, jezu już mi się rozpisywać nie chce.

0
slawek85 napisał(a)

To jest źle, jezu już mi się rozpisywać nie chce.

A co niby jest źle.
Dodawaj do listy wskaźniki na obiekty klasy bazowej. Używaj metod wirtualnych przy ich przeładowaniu.
Jak będziesz chciał używać metod które są w B a nie ma w A poczytaj o operatorze dynamic_cast

0
mambutu napisał(a)
class B:A{}   // <----
list< B> mylist;   //<---- list od BE
A objekt;
mylist.push_back(A);  // <--- push AA

I stad moje pytanie skoro obiekt B dziedziczy po A to jest tez obiektem A 'po czesci' i stad moje pytanie czy mozna wykonac jakis myk by dodawac obiekty bazowe do listy ktora ma zadeklarowane przechowywac jakis obiekt dziedziczacy??

pre'scriptum: przedmowcom radze czytac uwazniej:)

Da sie, ale sadze ze jestes poczatkujacy, i tego nie pokaze, gdyz jest zbyt niebezpieczne w uzyciu i Twoj(e) program(y) beda niestabilne.

Sens dziedziczenia posrod elementow list jest taki, aby operowac na szczegolowych, roznych, konkretnych implementacjach klas dziedziczacych D:A, C:A, B:A, widzac je pod postacia ich 'wspolnego mianownika', czyli jako wystapienia klasy A. stad, tworzac liste wskaznikow na obiekty A, mozesz do tej listy smialo powstawiac takze wskazniki na obiekty typu B, C, D i wszysto bedzie dzialac poprawnie.

wyobraz sobie teraz odwrotna sytuacje, taka o jakiej piszesz: masz liste wskaznikow na obiekty D {czyli: samochody}, a chcesz do tej listy wstawic obiekt A {czyli: 'pojazd'}. jak potem bedziesz przegladac te liste, skoro jej typ to samochod - bedziesz widziec same samochody. na jakims elemencie odpalasz metode "uruchomSilnik" albo "otworzDrzwi" ---- jak one mialyby sie wykonac, jesli ow element okazalby sie byc owym 'pojazem'? klasy A, czyli pojazdu, te metody moga nieobowiazywac i w ogole moga nie istniec!

niemniej, jest to wykonalne. w ogole, nie wiele jest rzeczy, ktorych nie da sie zrobic jak czlowiek sie uprze. pytanie tylko: jaki sens ryzykowac ze strzelisz sobie w stope? przekonstruuj problem tak, abys nie musial tam tego wstawiac, albo zebys mial liste z typem bardizej ogolnym

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