/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/*
* File: Poilimorfismo ed ultilizzo di virtual
* Author: alessandrobarazzuol
*
* Created on 26 gennaio 2020, 13.55
*/
#include <cstdlib>
#include<iostream>
using namespace std;
/*
*
*/
class Madre
{
public:
int valore;
string s;
Madre()
{
valore=0;
s="Madre";
}
/*virtual qui serve per il polimorfismo del metodo get_s nel caso
di oggetti derivati creati dalla classe base*/
virtual string get_s()
{
return "Madre :"+ s;
}
};
/*virtual qui serve per la classe C, per forzare il compilatore a includere la base virtuale una sola volta nella definizione
degli oggetti derivati ( es classe C) , in quanto essendo sia A che B derivate da Madre ed essendo che C deriva sia
da A che da B, attributi e metodi di Madre devono essere inclusi una sola volta */
class A:public virtual Madre
{
public:
A()
{
s="A";
valore=65;
}
string get_s()
{
return "A: "+ s;
}
};
class B:public virtual Madre
{
public:
B()
{ s="B";
valore=66;
}
string get_s()
{
return "B: "+s;
}
};
class C:public A,public B
{
public:
C()
{
s="C";
valore=67;
cout<<A::valore<<endl;
cout<<s<<endl;
}
string get_s()
{
return "C: "+ s;
}
};
int main(int argc, char** argv) {
/*esempio di polimorfismo*/
Madre *m=new Madre;
m=new C;
cout<<m->get_s()<<endl;
m=new B;
cout<<m->get_s()<<endl;
m=new A;
cout<<m->get_s()<<endl;
return 0;
}
//output
/*
67
C
C: C
B: B
A: A
*/