[C++] Dziedziczenie i abstrakcyjne klasy bazowe

Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Dziedziczenie i abstrakcyjne klasy bazowe

Post autor: mortan517 »

Witam, mam problem z pewnymi klasami. Dwie dziedziczą po abstrakcyjnej klasie bazowej i gdy chcę wyświetlić zawartość przeciążonym operatorem to wyskakują same adresy.
main.cpp:    
dma.cpp:    
dma.h:    

Edit: w pliku main.cpp w \(\displaystyle{ 35}\) linijce jest błąd, powinna ona wyglądać tak: cout << *(ptr[i]) << endl;

Ale pojawia się następny problem. Wyświetla mi tylko składowe z bazowej klasy.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10225
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2362 razy

[C++] Dziedziczenie i abstrakcyjne klasy bazowe

Post autor: Dasio11 »

W linijce cout << *(ptr[i]) << endl; wskaźnik ptr[i] jest typu Dma*, więc wyłuskanie *ptr[i] traktuje pamięć pod tym wskaźnikiem jako zmienną typu Dma. Żeby to poprawić, możesz na przykład zdefiniować wirtualną metodę virtual void Dma::wypisz() (albo jeszcze lepiej virtual std::string Dma::to_string()) w klasie Dma i w klasach pochodnych, a następnie używać ich w następujący sposób:

Kod: Zaznacz cały

ptr[i]->wypisz();
lub

Kod: Zaznacz cały

std::cout << ptr[i]->to_string() << std::endl;
Wirtualność tej metody sprawi, że przy takim wywołaniu użyta będzie metoda odpowiadająca klasie, która faktycznie kryje się pod wskaźnikiem, mimo że sam wskaźnik jest typu Dma*.
Awatar użytkownika
mortan517
Użytkownik
Użytkownik
Posty: 3359
Rejestracja: 6 lis 2011, o 15:38
Płeć: Mężczyzna
Lokalizacja: Krk
Podziękował: 112 razy
Pomógł: 662 razy

[C++] Dziedziczenie i abstrakcyjne klasy bazowe

Post autor: mortan517 »

Po napisaniu tematu właśnie utworzyłem wirtualną metodę Show i wszystko zadziałało. Dzięki za odpowiedź, już wszystko jasne.
ODPOWIEDZ