2011-09-15 20 views
9

Sto leggendo del testo C++ all'indirizzo https://cs.senecac.on.ca/~chris.szalwinski/archives/btp200.082/content/adhoc.html.quali sono i polimorfismi parametrici e di inclusione in C++

Nella sezione UNIVERSAL POLYMORPHISM, l'autore ha menzionato i polimorfismi Parametric e Inclusion. Non sono del tutto sicuro di aver compreso il punto, in particolare perché il polimorfismo Parametric viene implementato in fase di compilazione mentre il polimorfismo Inclusion viene implementato in fase di esecuzione?

Qualcuno può darmi una spiegazione chiara o un esempio, per favore?

+0

Si potrebbe essere interessati a leggere questa risposta: http://stackoverflow.com/a/36949734/67634 – Zuu

risposta

9

"Parametric polymorphism" in C++ significa modelli.

I pensare che "inclusione polimorfica" in C++ significa polimorfico il modo in cui lo standard si riferisce ad esso: metodi virtuali, sottoclassi e simili.

Penso che i nomi siano goffi e non siano accademici.

+0

Dannazione, bastonatemi. – Edwin

3

Penso che per "Parametric" si riferisca a method/function overloading - possiamo determinare quale metodo deve essere usato in fase di compilazione osservando il tipo di dati dei suoi parametri.

E "inclusione" significa method/function overriding - in una relazione di sottoclasse genitore, se entrambe le classi genitore e figlio hanno la stessa funzione, allora sarebbe determinata in fase di esecuzione (a seconda del tipo di oggetto) quale metodo sarebbe invocato .

+0

Se si legge un po 'più vicino, è necessario comprendere che il polimorfismo Parametrico si applica solo ai metodi sovraccaricati che fanno la stessa cosa. Cioè, 'foo ('8')' dovrebbe fare la stessa cosa come 'foo (8)'. – Edwin

1

Ho compreso che il polimorfismo universale è diverso da quello che ci aspettiamo in C++. Il C++ è un polimorfismo ad-hoc.

Universal dice che può esserci solo la versione della stessa firma, indipendentemente dal numero di tipi.

Penso che le altre risposte sfiorino il dettaglio che parametrico e inclusione sono categorie di universale. Dato il testo originale, posso vedere come loro o io siamo stati confusi. ;)

Dato sottostante:

struct Foo { 
    virtual void foo(); 
}; 

struct Bar { 
    virtual void bar(); 
    // virtual void foo(); // this would error 
}; 

Parametric sarebbe come:

struct FooBar : public Foo, public Bar {}; 

Le firme contenute in FooBar è determinato staticamente in fase di compilazione.

C++ non supporta direttamente il polimorfismo di inclusione. Sarebbero più vicini all'iniezione che potresti trovare nei linguaggi di scripting in cui le funzioni sono di primo ordine.

Si prega di non prendere questo codice alla lettera, è solo per la dimostrazione.

struct FooBar {}; 

int main() { 
    FooBar foob; 
    foob.foo = Foo::foo; 
    foob.bar = Bar::bar; 
    return 0; 
} 

FooBar non conosce la sua interfaccia in fase di compilazione, è dinamico composto. Ho usato un comportamento simile in javascript e Lua, e sono sicuro che molti altri hanno simili.