E-gradiva > Računalništvo > Programiranje > Načrtovanje in razvoj programskih aplikacij > Objektno programiranje > Večkratno dedovanje

Prijava

Večkratno dedovanje

 

 

Razred je lahko izpeljan tudi iz več kot enega razreda. V tem primeru govorimo o večkratnem dedovanju. Definirajmo razred student_asistent, ki naj predstavlja osebe, ki so hkrati študentje in asistentje.

 

#include  "student.h"
#include "asistent.h"

class
student_asistent : public student, public asistent

{


public
:
student_asistent (char i[], char n[], char s[], char v[]);

void
izpisi() const;

}

 

V konstruktorju razreda student_asistent sedaj podamo ime, naslov, poleg tega pa še smer in predmet. Oglejmo si definicijo konstruktorjev in metode izpisi().

 

#include  <iostream>


student_asistent :: student_asistent (char i, char n, char s, char v)

:
student (i, n, s), asistent ("---", "+++" , v) {}


void
student_asistent :: izpisi() const

{


student::izpisi();

cout << endl;

asistent::izpisi();

}

 

Z večkratnim dedovanjem dobi razred več primerkov nadrazredov:

 

 

Večkratno dedovanje

Slika 1: Večkratno dedovanje

 

 

 

V našem primeru je razred student_asistent izpeljan iz razredov student in asistent, ta dva pa sta izpeljana iz razreda oseba.  Objekt tipa student_asistent v tem primeru vsebuje dva objekta tipa oseba, ki sta med seboj neodvisna in lahko vsebujeta različne podatke. Različne podatke v obeh objektih tipa oseba lahko dosežemo tako, da konstruktorjema nadrazredov student in asistent podamo različne argumente:

 

: student (i, n, s),  asistent ("---", "+++" , v)

 

int main()

{


student sosolec("Janez", "Ljubljanska 12", "Računalništvo");

cout << "Student sosolec" << endl;

sosolec.izpisi();

cout << endl << endl;


student_asistent sosed("Peter", "Mariborska 23",

"Programska oprema"
, "Programiranje ");

cout << "Student-asistent sosed" << endl;

sosed.izpisi();

cout << endl;


return
0;

}

 


Program izpiše:

 

Student sosolec

Ime osebe: Janez

Naslov: Ljubljanska 12

Smer: Računalništvo

 

Student-asistent sosed

Ime osebe: Peter

Naslov: Mariborska 23

Smer: Programska oprema

Ime osebe: ---

Naslov: +++

Vaje: Programiranje

 

 

Če v razredu student_asistent ne definiramo metode za izpis izpisi(),  je klic sosed.izpisi() napačen, saj prevajalnik ne ve, katero od metod izpisi() naj kliče; tisto, ki je v razredu student ali tisto, ki je v razredu asistent. V tem primeru moramo sami navesti nadrazred, katerega metoda za izpis se naj kliče: student::izpisi() ali asistent::izpisi().