Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dziedziczenie - konstruktory

Ostatnio zmodyfikowano 2016-03-01 17:21
Autor Wiadomość
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:
C/C++
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:
C/C++
#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:

C/C++
#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 ) //<--błąd w tej linii
{
    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ć.
P-145407
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.
P-145408
carlosmay
» 2016-02-29 12:05:12
P-145409
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.
P-145410
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:

C/C++
//Same ciało konstruktora
pochodna::pochodna( int a, int b, int c )
    : Baza() //Pusty Konstruktor bazy pierwotnej
{
    dl = c;
    wys = a; // Czemu tak nie można, z mojego punktu widzenia jestem w klasie pochodna i dotyczy się to zmiennej odziedziczonej
}

P-145413
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
P-145416
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ę?
P-145420
1aam2am1
» 2016-02-29 19:04:24
wys jest private nie protected
P-145423
« 1 » 2
  Strona 1 z 2 Następna strona