Virtual C++

//
//  main.cpp
//  Significato del termine virtual in C++
//
//  Created by alessandro barazzuol on 06/01/21.
//  Copyright © 2021 Alessandro Barazzuol. All rights reserved.
//

#include <iostream>
using namespace std;

/*
 
 Creo una classe oggetto generica
 */

class object
{
public:
    string s;
    object()
    {
        
    }
    object(string s)
    {
        this->s=s;
    }
    
    virtual void print()
    {
        cout<<"Sono l'oggetto object\n";
    }
    
    
    
};

/*ora creo una classe a che deriva da object*/
class a:public object
{
    public:
    a()
    {
        
    }
    /*il costruttore a parametri a(string,int) costruisce un oggetto
      attraverso il costruttore a parametri object(string)*/
    a(string s, int i):object(s)
    {
        
        
    }
    void print()
    {
        cout<<"sono l'oggetto A\n";
        
    }
    
};

/*ora creo una classe b che deriva sempre da object...ereditarietà multipla*/

class b:public object
{
    public:
    b()
    {
        
    }
    void print()
    {
        cout<<"Sono l'oggetto B\n";
    }
    
};


/*Ora creo una funzione wath(object) che prende un oggetto creato e ci dice
  l'oggetto che è stato passato*/

void wath(object *o)
{
    o->print();
    
}






int main()
{
    /*testiamo la classe object*/
    /*object *o=new object();
    o->print();*/
    
    /*chiamo la funzione wath(object) passando l'oggetto object*/
    
    /*object oo;
    wath(oo);*/
    
    /*ora gli passo sempre un oggetto ma tipo b*/
    
    b *B=new b();
    wath(B);//molto stranamente abbiamo passato un oggetto B e ci dice che
            //ha ricevuto un oggetto object ???
    
    /*mettendo la parola chiave virtual davanti alla funzione print()
      nella classe object le cose cambiano*/
    /*la parola virtual fa funzionare l'ereditarietà multipla in C++*/
    
    
    /*piccola considerazione: guardate cosa succede se l'oggetto
    è passato per valore By Value*/
    
    /*da questo esempio si capisce bene anche la differenza tra passaggio
      By value e By reference o per puntatore*/
    
    /*questo succede perchè passando per riferimento il compilatore avendo l'indirizzo sa perfettamente chi è l'oggetto che gli passiamo*/
    
    
     
    
    
    
}