Ma se io istanzio la classe derivata come classe base, ossia creo una variabile di tipo classe base e le attribuisco invece una classe derivata, cosa succede?
Dovrebbe eseguire sempre i metodi della classe base.
C++
#include "iostream"
using namespace std;
class Base{
public:
void metodo(){
cout << "Io sono il metodo della classe Base" << endl;
getchar();
}
};
class Derivata: public Base{
public:
void metodo(){
cout << "Io ridefinisco il metodo della classe Base" << endl;
getchar();
}
};
void main(){
Base miaBase;
Derivata miaDerivata;
Base x;
x= miaDerivata;
miaBase.metodo();
miaDerivata.metodo();
x.metodo();
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io sono il metodo della classe Base
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Base
{
public void metodo()
{
Console.WriteLine("Io sono il metodo della classe Base");
Console.ReadLine();
}
}
class Derivata:Base{
public void metodo()
{
Console.WriteLine("Io ridefinisco il metodo della classe Base");
Console.ReadLine();
}
}
class Program
{
static void Main(string[] args)
{
Base miaBase=new Base();
Derivata miaDerivata=new Derivata();
Base x;
x = miaDerivata;
miaBase.metodo();
miaDerivata.metodo();
x.metodo();
}
}
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io sono il metodo della classe Base
Ma proviamo in C++ coi puntatori:
#include "iostream"
using namespace std;
class Base{
public:
void metodo(){
cout << "Io sono il metodo della classe Base" << endl;
getchar();
}
};
class Derivata: public Base{
public:
void metodo(){
cout << "Io ridefinisco il metodo della classe Base" << endl;
getchar();
}
};
void main(){
Base * miaBase=new Base;
Derivata * miaDerivata= new Derivata;
Base * x;
x= miaDerivata;
miaBase->metodo();
miaDerivata->metodo();
x->metodo();
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io sono il metodo della classe BaseAnziché attribuire a un nuovo puntatore il valore di un altro, creiamo tramite allocazione dinamica della memoria una nuova istanza della classe:
...
void main(){
Base * miaBase=new Base;
Derivata * miaDerivata= new Derivata;
Base * x = new Derivata;
miaBase->metodo();
miaDerivata->metodo();
x->metodo();
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io sono il metodo della classe BaseSempre uguale, dunque: attribuendo un oggetto di tipo classe derivata a una variabile di tipo classe base, o mettendone l'indirizzo in un puntatore tipo classe base, verranno sempre eseguiti i metodi della classe base.
Adesso ovviamo a questo con le funzioni virtuali:
#include "iostream"
using namespace std;
class Base{
public:
virtual void metodo(){
cout << "Io sono il metodo della classe Base" << endl;
getchar();
}
};
class Derivata: public Base{
public:
void metodo(){
cout << "Io ridefinisco il metodo della classe Base" << endl;
getchar();
}
};
void main(){
Base miaBase;
Derivata miaDerivata;
Base x;
x=miaDerivata;
miaBase.metodo();
miaDerivata.metodo();
x.metodo();
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io sono il metodo della classe BaseCon le variabili il risultato è sempre quello di prima: la classe Base esegue i metodi della classe Base.
Vediamo con i puntatori:
.....
void main(){
Base * miaBase=new Base;
Derivata * miaDerivata=new Derivata;
Base * x = new Derivata;
miaBase->metodo();
miaDerivata->metodo();
x->metodo();
}
Io sono il metodo della classe Base Io ridefinisco il metodo della classe Base Io ridefinisco il metodo della classe BaseEcco! Con le funzioni virtuali, a patto che si usino i puntatori e non le variabili, in C++ l'istanza della classe derivata eseguita come tipo base esegue i metodi della classe derivata.
Nessun commento:
Posta un commento