C++ dziedziczenie - podstawy

Wrzesień 20, 2012

W przedostatnim poście na temat programowania (tutaj) zaczęliśmy podstawy obiektowości. Kody źródłowe z tamtego posta wzbogacimy teraz o podstawy dziedziczenia, które jest chyba najważniejszą cechą programowania obiektowego.

Dziedziczenie w uproszczeniu polega na tym, że mamy dwie klasy: bazową oraz potomną. Klasa potomna poza swoimi cechami otrzymuje również cechy klasy bazowej. Jest to bardzo wygodne gdyż wiele klas potomnych może dziedziczyć po jednej klasie bazowej.

Wyobraźmy sobie system w którym potrzebujemy przechować dane studenta oraz wykładowcy. Zarówno student jak i wykładowca to osoba, każdy z nich posiada imię, nazwisko etc. ale tylko student posiada indeks a tylko wykładowca posiada prawo do wpisywania ocen. Jeżeli z obu tych opisów wydzielimy część wspólną i stworzymy z niej klasę bazową nie będziemy musieli dwa razy pisać praktycznie tego samego kodu, bądziemy mieli nad nim też większą kontrolę (i będzie podatniejszy na modyfikacje).
W przykładzie poniżej pojawia się najprostsza forma dziedziczenia:

code5.cpp

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class Osoba
{
  protected: 
    string imie;
    string nazwisko;  
    
  public:
    Osoba(string _imie, string _nazwisko);
    void ShowInfo(void);
};

Osoba::Osoba(string _imie, string _nazwisko)
{
  this->imie = _imie;
  this->nazwisko = _nazwisko;
} // ::Osoba

void Osoba::ShowInfo(void)
{
  cout << this->imie << " " << this->nazwisko << endl;
} // ::ShowInfo

class Student : public Osoba
{
  private:
    string uczelnia;

  public:
    Student(string _imie, string _nazwisko, string _uczelnia);
    void ShowInfo(void);
};

Student::Student(string _imie, string _nazwisko, string _uczelnia) 
        :Osoba(_imie, _nazwisko)
{
  this->uczelnia = _uczelnia;
} // ::Student

void Student::ShowInfo()              
{
  cout << "Uczelnia: " << this->uczelnia << " " << this->imie << " " << this->nazwisko << endl;
} // ::ShowInfo

int main(char* argv[], int args)
{
  cout << "Pierwszy tekst" << endl;
  
  Osoba ja = Osoba("Bogus", "Cenian");
  ja.ShowInfo();
  
  Student ty = Student("Jan", "Kowalski", "PG");
  ty.ShowInfo();
  
  cin.get();
  
  return 0;
} // main

Poniżej dziedziczenie zostało rozbudowane jeszcze o wykorzystanie w klasie potomnej metody ShowInfo(), która jest odziedziczona po klasie Osoba (zwróć uwagę, że w klasie Student taka metoda nie występuje).

code6.cpp

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class Osoba
{
  protected: 
    string imie;
    string nazwisko;  
    
  public:
    Osoba(string _imie, string _nazwisko);
    void ShowInfo(void);
};

Osoba::Osoba(string _imie, string _nazwisko)
{
  this->imie = _imie;
  this->nazwisko = _nazwisko;
} // ::Osoba

void Osoba::ShowInfo(void)
{
  cout << this->imie << " " << this->nazwisko << endl;
} // ::ShowInfo

class Student : public Osoba
{
  private:
    string uczelnia;

  public:
    Student(string _imie, string _nazwisko, string _uczelnia);
    void ShowInfoS(void);
};

Student::Student(string _imie, string _nazwisko, string _uczelnia) 
        :Osoba(_imie, _nazwisko)
{
  this->uczelnia = _uczelnia;
} // ::Student

void Student::ShowInfoS()              
{
  cout << "Uczelnia: " << this->uczelnia << " " << this->imie << " " << this->nazwisko << endl;
} // ::ShowInfoS

int main(char* argv[], int args)
{
  cout << "Pierwszy tekst" << endl;
  
  Osoba ja = Osoba("Bogus", "Cenian");
  ja.ShowInfo();
  
  Student ty = Student("Jan", "Kowalski", "PG");
  ty.ShowInfo();
  ty.ShowInfoS();
  
  cin.get();
  
  return 0;
} // main

Pobierz pliki
Ostatnie wpisy
image
Październik 05, 2012

Operacje na plikach - cześć pierwsza zapis do pliku

image
Wrzesień 20, 2012

Trzy Korony, 982 m.n.p.m., Pieniny

image
Wrzesień 20, 2012

Mechanizm dziedziczenia - czyli podstawy programowania obiektowego