Hej mirko Uczę się #cpp i próbuję ogarnąć dziedziczenie. Czy robię to dobrze? http://wklej.org/id/3068545/ Chodzi o to żeby stworzyć klasę bazową, abstrakcyjną, a potem deklarować zmienne o typie klasy bazowej i wywoływać do niej obiekty klas rozszerzających bazową. #programowanie
@SiarkoWodor: wywoływać do niej obiekty klas? dlatego właśnie sama nauka programowania to nie wszystko, a studia są potrzebne. wróć do czytania teorii, a później się bierz za pisanie, bo to bez sensu
@SiarkoWodor: nie łapię za słówka, ale nie widzę w ogóle sensu w tym co piszesz. spróbuj sobie znaleźć jakiś praktyczny przykład wykorzystania dziedziczenia (jak ten klasyk z samochodami) i na tej podstawie się ucz to coś z tego zapamiętasz
@Kiszka_94: Nie mam problemu z zapamiętywaniem, wcześniej programowałem w językach wyższego poziomu w których nie było zabawy ze wskaźnikami (Java, języki webowe). Najbardziej chodzi mi o ten fragment:
Base *e = new Ext(); Base *e1 = new Ext2(); I o to że tworzę obiekty klas rozszerzających klasę Base do zmiennej typu Base zamiast:
@Saly: @simia: Powinna, ja bym tylko dodał - każdy polimorficzny typ nie oznaczony jako final. Ewentualnie niewirtualny i niepubliczny destruktor, ale wtedy zniszczenie wskaźnika do klasy bazowej jest niemożliwe (błąd kompilacji).
@simia: Tak jak napisałem wyżej - tylko wtedy kiedy akceptowalna jest niemożliwość zniszczenia obiektu klasy bazowej. To jest raczej rzadki przypadek. W każdym innym przypadku powinien być wirtualny, inaczej wnosimy ryzyko undefined behaviour do programu.
@wolodia: nie widzę sensu istnienia czegoś takiego. skoro typ jest polimorficzny i final to dziedziczy po typach które są polimorficzne i mają wirtualny destruktor , a ponieważ wirtualny destruktor jest dziedziczony, to taki typ i tak będzie miał wirtualny destruktor.
@wolodia: Jasne zgoda. Prawde mowiac nie jest to tak rzadki przypadek jakby sie moglo wydawac. Zgadzam sie w pelni z "powinien byc wirtualny albo niepubliczny" nie zgadzam sie z "powinien byc wirtualny".
Czemu od dwóch tygodni wszyscy zewsząd straszą wojną? Jak to się stało że w ciągu kilku miesięcy przeszliśmy ze śmiania się z orków i wyśmiewania Putina ze na ukrainie nic nie jest w stanie zrobić, do zapowiedzi że zaraz wojna i to na terenie Polski?
Uczę się #cpp i próbuję ogarnąć dziedziczenie. Czy robię to dobrze?
http://wklej.org/id/3068545/
Chodzi o to żeby stworzyć klasę bazową, abstrakcyjną, a potem deklarować zmienne o typie klasy bazowej i wywoływać do niej obiekty klas rozszerzających bazową.
#programowanie
Base *e = new Ext();Base *e1 = new Ext2();
I o to że tworzę obiekty klas rozszerzających klasę Base do zmiennej typu Base zamiast:
Ext e = Ext();Ext e1 = Ext2();
1. Nie dealokujesz pamięci.
2. Warto funkcje implementujące getValue() oznaczyć jako override żeby sobie wyrobić nawyk
http://en.cppreference.com/w/cpp/language/override
Tak twierdzi także CppCoreGuidelines.
http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rc-dtor-virtual
@simia: Tak jak napisałem wyżej - tylko wtedy kiedy akceptowalna jest niemożliwość zniszczenia obiektu klasy bazowej. To jest raczej rzadki przypadek. W każdym innym przypadku powinien być wirtualny, inaczej wnosimy ryzyko undefined behaviour do programu.
@wolodia: nie widzę sensu istnienia czegoś takiego. skoro typ jest polimorficzny i final to dziedziczy po typach które są polimorficzne i mają wirtualny destruktor , a ponieważ wirtualny destruktor jest dziedziczony, to taki typ i tak będzie miał wirtualny destruktor.