elradziu Temat założony przez niniejszego użytkownika |
Dziedziczenie - konstruktory » 2016-02-29 11:55:40 Witam mam pewien problem odnośnie dziedziczenia. A mianowicie z tego co wiem to konstruktora się nie dziedziczy. Więc za każdym razem gdy stworzę klasę pochodną i chcę by miała ona inny konstruktor niż domyślny, to muszę go zadeklarować i zdefiniować jego ciało. Ale piszą prosty program napotkałem problem A mianowicie: Plik klasa.h: class Baza { int wys, szer; public: Baza( int a, int b ); };
class pochodna : public Baza { int dl; pochodna( int a, int b, int c ); };
Plik klasa.cpp: #include <iostream> #include "klasa.h" using namespace std; Baza::Baza( int a, int b ) { wys = a; szer = b; }
pochodna::pochodna( int a, int b, int c ) : Baza( a, b ) { dl = c; }
Taki kod działa ładnie. "odziedziczony" konstruktor wywołuje się na rzecz klasy pochodnej. Ale jak już to samo będę chciał zapisać w ten sposób: #include <iostream> #include "klasa.h" using namespace std; Baza::Baza( int a, int b ) { wys = a; szer = b; }
pochodna::pochodna( int a, int b, int c ) { wys = a; szer = b; dl = c; }
To dostaję błąd: ||=== Build: Debug in klasy (compiler: GNU GCC Compiler) ===| D:\Radek\CB\klasy\klasa.cpp||In constructor 'pochodna::pochodna(int, int, int)':| D:\Radek\CB\klasy\klasa.cpp|11|error: no matching function for call to 'Baza::Baza()'| D:\Radek\CB\klasy\klasa.cpp|11|note: candidates are:| D:\Radek\CB\klasy\klasa.cpp|4|note: Baza::Baza(int, int)| D:\Radek\CB\klasy\klasa.cpp|4|note: candidate expects 2 arguments, 0 provided| D:\Radek\CB\klasy\klasa.h|1|note: Baza::Baza(const Baza&)| D:\Radek\CB\klasy\klasa.h|1|note: candidate expects 1 argument, 0 provided| D:\Radek\CB\klasy\klasa.h|3|error: 'int Baza::wys' is private| D:\Radek\CB\klasy\klasa.cpp|13|error: within this context| D:\Radek\CB\klasy\klasa.h|3|error: 'int Baza::szer' is private| D:\Radek\CB\klasy\klasa.cpp|14|error: within this context| ||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 7 second(s)) ===|
Z których wynika że w linii zaznaczonej odwołuję się konstruktora klasy pierwotnej (a z mojego punktu widzenia jest to nie prawda) no i błędy iż dwa argumenty są prywatne w klasie Baza. Ale z mojego punktu widzenia w konstruktorze pochodna to powinienem odwoływać się do wartości klasy pochodna a nie baza. Może że czegoś nie rozumiem. Proszę o waszą pomoc. No może że tylko ten pierwszy zapis jest poprawny i tak ma być. |
|
carlosmay |
» 2016-02-29 11:59:45 Do zmiennych prywatnych klasy bazowej jest dostęp za pośrednictwem konstruktora, metody bądź funkcji zaprzyjaźnionej. Pierwszy przykład jest poprawny.
Klasa pochodna dziedziczy interfejs publiczny i z niego korzystasz. |
|
carlosmay |
» 2016-02-29 12:05:12 |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2016-02-29 12:20:03 To czemu przykład drugi jest zły? Czemu w takim przypadku napotykam na podane błędy kompilacji? Bo mam wrażenie że czegoś nie rozumiem. |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2016-02-29 12:31:00 Czyli z tego wynika że tylko i wyłącznie ten pierwszy zapis jest poprawny i zawszę muszę wywoływać "odziedziczony" konstruktor, tak? I dla czego jak będę chciał w konstruktorze klasy pochodnej edytować zmienną wys to nie mogę? Przykład: pochodna::pochodna( int a, int b, int c ) : Baza() { dl = c; wys = a; }
|
|
1aam2am1 |
» 2016-02-29 13:22:38 Baza niema konstruktora bez argumentów, więc go nie wywołasz Baza() --nie ma go, jest niezadeklarowany wys jest private nie protected |
|
elradziu Temat założony przez niniejszego użytkownika |
» 2016-02-29 16:49:26 W ostatnim poście źle sprecyzowalem. Chodziło mi ze nawet jak utworze pusty konstruktor bez argumentów i go wywolam. Wiec on istnieje. Ale z tego co wnioskuję to w celu wykonania jakich kolwiek operacji na odziedziczonych zmiennych to najpierw trzeba je przesłanic. Inaczej trzeba korzystać z odziedziczonych metod. Zgadza się? |
|
1aam2am1 |
» 2016-02-29 19:04:24 wys jest private nie protected |
|
|
« 1 » 2 |