|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[c++] polimorfismo: overriding
Sto studiando il polimorfismo e l'ereditarietà c++.
Ho dei dubbi: Il polimorfismo non è nient'altro che la ridefinizione nella classe derivata di una funzione della classe base.. (Overriding).. Vero? Non ho capito la differenza tra la ridefinizione in una classe derivata di una funzione non virtual di una classe base e la definizione di una funzione dichiarata virtual nella classe base |
|
|
|
|
|
#2 | ||
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12862
|
Quote:
Quote:
Comunque in soldoni: Il polimorfismo è la capacità di chiamare i metodi di un oggetto concreto attraverso una sua generalizzazione (ad esempio una interfaccia o una classe astratta). Ad esempio: Codice:
class IShape
{
public:
virtual double area() {
throw std::runtime_error("not implemented");
}
};
class Rect : public IShape
{
public:
virtual double area() {
return lato_a*lato_b;
}
};
class Circle : public IShape
{
public:
virtual double area() {
return PI*radius*radius;
}
};
int main(void)
{
std::vector<IShape*> shapes;
shapes.push_back(new Circle(..));
shapes.push_back(new Rect(..));
for (auto sp : shapes)
{
std::cout << "Area of shape: " << sp->area() << std::endl;
}
// free resources, etc, etc...
return 0;
}
Cosa significa? Che il compilatore evita di fare il collegamento tra la chiamata Codice:
sp->area() Codice:
IShape::area() Questa cosa prende anche il nome di late binding (binding ritardato). Se il metodo non fosse virtual, allora il compilatore procederebbe nel solito modo, quindi il main lancerebbe subito eccezione, perché appunto il compilatore assume che stai chiamando il metodo area() della classe IShape. Questo contrasta con Java, dove i metodi sono di default sempre virtuali (non hai bisogno infatti della parola chiave virtual). Spero sia chiaro. Ultima modifica di WarDuck : 29-06-2014 alle 19:05. Motivo: Cambiato il tipo di ritorno :) |
||
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
se hai una classe A con una funzione k non virtual, crei B ereditando da A e in B ridefinisci k, stai solo sprecando tempo e complicando il tuo lavoro ereditando da A. Tanto vale definire B come classe a se stante se la relazione alla base dell'ereditarietà is a non sussiste. Quote:
Da notare che in C++ l'ereditarietà è multipla, e ci sono problemi legati all'ereditarietà in generale che hanno fatto perdere un po' di appeal alla pratica, inoltre c'è anche un piccolo prezzo da pagare per i metodi e le funzioni virtual dovuto al lookup del puntatore di cui sopra, e dovuto al fatto che a runtime il tuo eseguibile deve decidere quale definizione corrisponde alla tua chiamata ad una funzione virtual . Ci sono linguaggi in cui i metodi non sono magari sempre "virtual" ma il "dynamic binding" è più esplicito come Objective-C, con un po' di Obj-C probabilmente capiresti meglio come funzionano certe cose, per altro Obj-C è praticamente una copia 1:1 di C con un po' più di puntatori buttati qua e la e qualche keyword nuova. In C++ c'è anche il caso della funzione pure virtual che praticamente serve a "forzare la mano" a chi deriva dalla tua classe base nel definire un certo metodo, in caso contrario, cioé ereditando una pure virtual senza definirla, il codice non compila neanche. |
||
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Ho letto mille volte l'argomento sul libro..
Ora ho capito la differenza. Cioe tra un overriding non virtual e una ridefinizione di un metodo virtual. In pratica si nota se istanzio un puntatore di tipo classe base che punta a un oggetto della classe derivata. Le funzioni virtuali pure ho capito pure a cosa servono Permettono di definire una classe astratta senza definire le funzioni nella classe stessa.. Ovviamente non è possibile istanziare un oggetto di una classe astratta. Ma posso definire un solo metodo ad esempio? E quando eredito la classe astratta posso ridefinire tranquillamente la funzione virtuale pura nella classe derivata e istanziare oggetti di tipo classe derivata? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Forse volevi dire classe base!!
[quote=vendettaaaaa;41259930Se definisci solo un metodo come puro e nella classe derivata lo implementi, allora puoi usare oggetti della classe derivata [/QUOTE] Ultima modifica di mistergks : 30-06-2014 alle 00:30. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Ehm... no.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:35.




















