2016-06-01 21 views
9

Capisco il polimorfismo e comprendo vagamente il sovraccarico, ma apprezzerei qualcuno che comprendesse completamente due concetti per spiegare qual è la differenza categoriale e se il sovraccarico sia o non sia una forma di polimorfismo (sembra essere in disaccordo su questo).Qual è la differenza tra polimorfismo e sovraccarico?

+1

Si potrebbe fare peggio di guardare su Wikipedia: https://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29 – Galik

+0

Haskell ha * polimorfismo parametrico *, in cui si hanno funzioni che funzionano in modo identico su più tipi, ad es. 'length :: [a] -> Int' funziona per liste di stringhe, liste di doppi, ecc. Tutto ciò di cui hai bisogno è una singola definizione, dato che un valore parametrico polimorfo non si preoccupa di cosa sia il parametro, solo dove è usato . Ha anche typeclass che utilizza per il polimorfismo * ad hoc *, funzioni in cui l'implementazione dipende dal tipo, ad es. 'show :: Show a => a -> String' è una famiglia di funzioni ognuna con una propria definizione:' show :: Int -> String, show :: Double -> String, ... '. – rampion

risposta

8

Il polimorfismo, nel suo nucleo, riguarda più cose che hanno tutte un determinato insieme di comportamenti coerenti, tali da poter essere sostituiti con un altro all'interno di un particolare algoritmo o processo. Fintanto che tutti forniscono l'interfaccia prevista, il processo funziona ancora.

Il sovraccarico non ha davvero una base.È semplicemente la possibilità di nominare due o più funzioni con lo stesso nome, purché abbiano elenchi di parametri diversi. Il compilatore capisce quale funzione in realtà intendevi in ​​base ai tipi di argomenti che passi.

Ora il sovraccarico può essere utilizzato per creare il polimorfismo. Si consideri il seguente:

template<typename T> 
void func(T t) {call(t);} 

Ciò richiederà call, passando t come parametro. Ciò funzionerà finché fornirai un tipo T per il quale call(t) è un codice C++ legittimo. Si potrebbe fare questo sovraccaricando la funzione call per qualunque tipo siete interessati a utilizzare con func:

void call(int); 
void call(float); 
void call(vector<int>); 

In questo modo, func è una funzione che è polimorfa (staticamente) rispetto al suo parametro. Può eseguire le sue operazioni su qualsiasi tipo, purché tale tipo abbia l'interfaccia appropriata. Tale interfaccia è la possibilità di chiamare una funzione call con una variabile di quel tipo.

func(5); //Legal 
func(13.4); //Legal 
func(vector<int>{4, 3, 2, 1}); //Legal 
func(vector<float>{}); //NOT legal 

Qui, usiamo la funzione di sovraccarico call per creare una forma di polymophism tramite la funzione func. Ma questo non significa che il sovraccarico sia il polimorfismo.

Il sovraccarico è uno strumento di lingua. Il polimorfismo è un concetto. Il polimorfismo consiste nel far sì che più oggetti funzionino allo stesso modo. Il sovraccarico è solo un modo per assegnare a funzioni diverse lo stesso nome.

4

Polimorfismo: un metodo che ha implementazioni multiple a seconda del tipo di argomento (i) con cui viene richiamato. Spesso non noto al momento della compilazione. Il numero di argomenti è fisso e in C++ l'unico argomento il cui tipo è importante è il primo (this). In C++ la versione comune di questo richiede una classe base con i metodi virtual.

Sovraccarico: un nome che è in realtà più metodi a seconda del conteggio e del tipo degli argomenti con cui è stato richiamato. Sempre deciso al momento della compilazione. Nessuna classe base è coinvolta.

Se desideri un'analogia: il polimorfismo è quando si assumono una dozzina di meccanici specializzati per lavorare sulle automobili, e ognuno di essi ha funzioni come do_work(vehicle) e take_vacation(duration). Ognuno fa qualcosa di diverso ma tutti hanno la stessa firma a parte l'argomento "implicito questo" in C++ (ovvero self in Python, ecc.). Il sovraccarico è quando assumete la meccanica generalisti e ognuno di loro ha do_work(steering), do_work(lighting), do_work(engine), ecc

+0

L'ultimo paragrafo è d'oro !! –

+0

E il "polimorfismo in fase di compilazione"? –

+0

@NickyC: Ci sono due tipi di polimorfismo in fase di compilazione in C++: il tipo che è un'ottimizzazione perché il compilatore vede quale implementazione deve essere invocata e il tipo che è una caratteristica del linguaggio usando la metaprogrammazione del modello. Il primo si basa ancora su metodi 'virtuali' ma migliora le prestazioni; il secondo si basa sulla programmazione usando i tipi esplicitamente. –

1

Il sovraccarico è un sottoinsieme di polimorfismo. Il polimorfismo è di due tipi: in fase di esecuzione e in fase di compilazione. Sovraccarico appartiene a quest'ultima uno (ci sono alcuni altri aspetti della fase di compilazione/polimorfismo statico così come modelli, puntatori a funzione)

Di solito gli autori riferiscono polimorfismo a quello fatto sul run-time (se non specificato) e se si sta parlando di quel polimorfismo, allora è chiaro che che uno è fatto sul tempo di esecuzione (risposta di Giovanni già attirato le differenze di base wRT eredità/funzione virtuale nella sua risposta ci) e sovraccarico è fatto su c tempo di compilazione quando i parametri della funzione determinano quale sovraccarico deve essere chiamato.

Sovraccarico - Statico polimorfismo(Dimostrazione)

seguito screenshot può dimostrare come l'overloading di funzioni è statica (risolti prima fase di esecuzione)

enter image description here

PS

Se vuoi vedere, questa è una domanda correlata su overloading and virtual functions

+2

C++ ha anche "polimorfismo statico" che non sta sovraccaricando. –

+0

@JohnZwinck intendevo il suo unico tipo di polimorfismo statico. Ma grazie per aver attirato l'attenzione lì. L'ho aggiornato –

+0

Non penso che l'overloading di tutte le funzioni sia un tipo di polimorfismo dinamico. Un compilatore deve risolvere gli overload di funzioni non virtuali in fase di compilazione. –

Problemi correlati