/** * Esimerkki yhdistävästä moniperinnästä * - KirjastonKirja sisältää vain yhden teoksen. * Miika Nurminen, 8.11.2007 * (perustuu Rintala&Jokinen, oo, luku 6.8.2) */ #include #include using namespace std; class Teos { string nimi; public: Teos(string aNimi) : nimi(aNimi) { aloitus(); } virtual ~Teos() { lopetus(); } virtual void tulosta() { tulostaNimi(); cout << " " << nimi << endl; tulostaOmat(); // template method -suunnittelumalli } protected: virtual void tulostaNimi() { cout << "Teos"; } virtual void tulostaOmat() {} void aloitus() { tulostaNimi(); cout << endl; } void lopetus() { cout << "~"; tulostaNimi(); cout << endl; } }; class Kirja : virtual public Teos { int painovuosi; public: Kirja(string aNimi, int aPainovuosi) : Teos(aNimi), painovuosi(aPainovuosi) { aloitus(); } virtual ~Kirja() { lopetus(); } protected: virtual void tulostaNimi() { cout << "Kirja"; } virtual void tulostaOmat() { cout << "Painovuosi " << painovuosi << endl; } }; class KirjastonTeos : virtual public Teos { double luokitus; public: KirjastonTeos(string aNimi, double aLuokitus) : Teos(aNimi), luokitus(aLuokitus) { aloitus(); } virtual ~KirjastonTeos() { lopetus(); } protected: virtual void tulostaNimi() { cout << "KirjastonTeos"; } virtual void tulostaOmat() { cout << "Luokitus " << luokitus << endl; } }; // virtual-perintämerkintä täytyy olla yliluokissa! class KirjastonKirja : public Kirja, public KirjastonTeos { public: KirjastonKirja(string aNimi, int aPainovuosi, double aLuokitus) : Teos(aNimi), Kirja(aNimi,aPainovuosi), KirjastonTeos(aNimi, aLuokitus) { aloitus(); } virtual ~KirjastonKirja() { lopetus(); } protected: virtual void tulostaNimi() { cout << "KirjastonKirja"; } virtual void tulostaOmat() { Kirja::tulostaOmat(); KirjastonTeos::tulostaOmat(); } }; int main() { KirjastonKirja kk("C++ -ohjelmointi",2000,61.3); kk.tulosta(); return 0; }