lunedì 8 settembre 2014

Nascondimento: un metodo della classe derivata nasconde un metodo della classe base.

Ripassiamo un po' di nomenclatura, su cui mi sono fissato come da caratteristiche ossessive del mio carattere:
#include "iostream"
using namespace std;

class Base{
public:
	void metodo(){
		cout << "metodo della Base" << endl;
		getchar();
	}

};

class Derivata:public Base{
public:
	void metodo(){
		cout << "metodo della Derivata" << endl;
		getchar();
	}
};

void main(){

	Base*miaBase=new Base();
	Derivata*miaDerivata=new Derivata();

	miaBase->metodo();
	miaDerivata->metodo();
}
In questo caso il metodo metodo() della classe derivata nasconde il metodo metodo() della classe base.
Si dice nasconde perché quando io chiamo l'esecuzione di metodo() dalla classe derivata, mi esegue il codice specificato nel metodo riscritto nella classe derivata.
metodo della Base

metodo della Derivata




Se invece evito di scrivere un metodo() nella classe derivata, allora non viene nascosto quello ereditato:
#include "iostream"
using namespace std;

class Base{
public:
	void metodo(){
		cout << "metodo della Base" << endl;
		getchar();
	}

};

class Derivata: public Base{
public:

};

void main(){

	Base*miaBase=new Base();
	Derivata*miaDerivata=new Derivata();

	miaBase->metodo();
	miaDerivata->metodo();
}
metodo della Base

metodo della Base




Facciamo l'identica cosa in VB.NET:
Module Module1

    Class Base
        Public Sub metodo()
            Console.WriteLine("metodo della Base")
            Console.ReadLine()
        End Sub
    End Class

    Class Derivata
        Inherits Base
        Public Sub metodo()
            Console.WriteLine("metodo della Derivata")
            Console.ReadLine()
        End Sub
    End Class
    Sub Main()

        Dim miaBase As New Base
        Dim miaDerivata As New Derivata

        miaBase.metodo()
        miaDerivata.metodo()

    End Sub
metodo della Base

metodo della Derivata




Togliamo, allo stesso modo, il metodo della classe derivata:
Module Module1

    Class Base
        Public Sub metodo()
            Console.WriteLine("metodo della Base")
            Console.ReadLine()
        End Sub
    End Class

    Class Derivata
        Inherits Base
        
    End Class
    Sub Main()

        Dim miaBase As New Base
        Dim miaDerivata As New Derivata

        miaBase.metodo()
        miaDerivata.metodo()

    End Sub

End Module
metodo della Base

metodo della Base


Bene. Anche qui il metodo metodo() della classe derivata nasconde il metodo metodo() della classe base.
Ma quando io scrivo nella classe derivata un metodo con lo stesso nome del metodo della classe base ottengo un warning che mi dice che è opportuno mettere Overloads.
Perché?

Nessun commento:

Posta un commento