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:
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().