Programowanie obiektowe, wyklad5, Dziedziczenie


Relacje między klasami - dziedziczenie

Dziedziczenie opisuje relację "jest": punkt kolorowy jest punktem

// klasa bazowa

class Punkt {

private:

int x;

int y;

public:

void inicjalizuj(int, int);

void przesun(int,int);

0x08 graphic
void drukuj () ;

} ;

// klasa pochodna

class Punktkol : public Punkt

{ short kolor ; // nowa składowa

public :

void koloruj(short); // nowa funkcja

} ;

w main() :

Punktkol a;

// można się odwoływać zarówno do składowych klasy Punkt

// (publicznych) jak i klasy Punktkol (również publicznych)

a.inicjalizuj(1,1); // przypisanie wartości współrzędnych punktu:

// funkcja klasy bazowej

a.koloruj(2); // przypisanie koloru:

// funkcja klasy pochodnej

a.drukuj(); // drukowanie współrzędnych

// funkcja klasy bazowej

Dostęp do składowych klasy bazowej w klasie pochodnej

class Punkt {

private :

int x;

int y;

public :

void inicjalizuj(int, int);

void przesun(int, int);

void drukuj ();

} ;

void Punkt::inicjalizuj(int xx, int yy)

{ x = xx ; y = yy; }

void Punkt::przesun(int dx, int dy)

{ x = x + dx ; y = y + dy ; }

void Punkt::drukuj ()

{ cout << "Moje wspolrzedne " << x << " " << y << endl ; }

/////////////////////////////////////////////////////////////////

class Punktkol : public Punkt // Punktkol jest klasą pochodną Punkt

{ short kolor;

public :

void koloruj (short kk) { kolor = kk ; }

void drukujkol();

void inicjalizujkol(int xx, int yy, int kk);

} ;

void Punktkol::drukujkol ()

{

drukuj(); // na rzecz którego obiektu jest ta funkcja wywołana?

cout << "i moj kolor " << kolor << "\n" ;

}

void Punktkol::inicjalizujkol (int xx, int yy, short kk)

{

inicjalizuj(xx,yy);

kolor=kk ;

}

W main():

Punktkol p ;

p.inicjalizujkol (1,1,3) ; // składowa klasy Punktkol

p.drukuj () ; // składowa klasy Punkt

p.przesun (2,4) ; // składowa klasy Punkt

p.koloruj (2) ; // składowa klasy Punktkol

p.drukujkol() ; // składowa klasy Punktkol

Nadpisywanie funkcji składowych w klasie pochodnej

#include <iostream>

class Punkt

{

private :

int x ;

int y ;

public :

void inicjalizuj(int, int) ;

void przesun(int, int) ;

void drukuj () ;

} ;

void Punkt::inicjalizuj(int xx, int yy)

{

x = xx ; y = yy ;

}

void Punkt::przesun(int dx, int dy)

{

x = x + dx ; y = y + dy ;

}

void Punkt::drukuj ()

{

cout << "Moje wspolrzedne " << x << " " << y << "\n" ;

}

/////////////////////////////////////////////////////////////////

class Punktkol : public Punkt // Punktkol jest pochodną Punkt

{ short kolor ;

public :

void koloruj (short kk) { kolor = kk ; }

void drukuj(); // ponowna definicja drukuj()

void inicjalizuj(int, int, short); // ponowna definicja inicjalizuj()

};

void Punktkol::inicjalizuj(int xx, int yy, short kk)

{

Punkt::inicjalizuj(xx,yy); // funkcja inicjalizuj() klasy Punkt

kolor=kk;

}

void Punktkol::drukuj ()

{

Punkt::drukuj();

cout << "i moj kolor " << kolor << "\n" ;

}

W main():

Punktkol p ;

p.inicjalizuj (1,1,3) ;

p.drukuj () ; // funkcja drukuj() klasy Punktkol

p.Punkt::drukuj(); // funkcja drukuj() klasy Punkt

p.koloruj (2) ;

p.drukuj() ; // funkcja drukuj() klasy Punktkol

Nadpisywanie i przeciążanie

class A

{

...

public:

void f(int);

void f(char);

void g(int);

void g(char);

};

class B : public A

{

...

public:

void f(int);

void f(float);

};

W main() :

int n;

float x;

char c;

B b;

b.f(n); // wywołana funkcja B::f(int)

b.f(x); // wywołana funkcja B::f(float)

b.f(c); // wywołana funkcja B::f(int) - konwersja char na int

b.g(n); // wywołana funkcja A::g(int)

b.g(x); // błąd: niejednoznaczność A::g(int) czy A::g(char)

b.g(c); // wywołana funkcja A::g(char)

Wywoływanie konstruktorów i destruktorów

Brak dziedziczenia:

Istnieje klasa bazowa i klasa pochodna