Ereditarietà multipla, polimorfismo e virtual in C++ - Alessandro Barazzuol

Ereditarietà multipla, polimorfismo e virtual in C++

/*
 * 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
*/