/** * Esimerkki moniselitteisyyden purkamisesta * Miika Nurminen, 7.11.2007 * (perustuu Rintala&Jokinen, oo, luku 6.8.1) */ #include using namespace std; class Kirja { public: virtual void tulosta() { cout << "Kirja" << endl; } }; class Teos { public: virtual void tulosta() { cout << "Teos" << endl; } }; /** * Apuluokkia tarvitaan, jos tulosta-funktio pitää syrjäyttää aliluokissa * _molempien kantaluokkien suhteen_. * Jos ei tarvitsisi syrjäyttää, riittäisi k.Teos::tulosta()-tyylinen rakenne */ class KirjaApu : public Kirja { public: virtual void tulostaK() = 0; virtual void tulosta() { tulostaK(); } }; class TeosApu : public Teos { public: virtual void tulostaT() = 0; virtual void tulosta() { tulostaT(); } }; class KirjastonKirja : public KirjaApu, public TeosApu { public: virtual void tulostaK() { cout << "Kirja [syrjäytetty]" << endl; } virtual void tulostaT() { cout << "Kirja [syrjäytetty]" << endl; } /** * joskus toimiva ratkaisu - oma metodin määrittely alaluokassa */ /*/ virtual void tulosta() { cout << ">"; Kirja::tulosta(); cout << ">"; Teos::tulosta(); }*/ }; int main() { KirjastonKirja kk; kk.Teos::tulosta(); kk.Kirja::tulosta(); Teos* t = &kk; t->tulosta(); Kirja* k = &kk; k->tulosta(); // kk.tulosta(); // ei toimi (väliluokkien kanssa tai ilman, ellei määritelty KirjastonKirja-luokassa) return 0; }