Qualcuno potrebbe spiegare dove i compilatori C++ mantengono i valori predefiniti per i parametri per le funzioni virtuali? So che non è una buona idea modificare questi parametri nelle classi figlie, ma perché? Grazie.Parametri predefiniti delle funzioni virtuali
risposta
È una cattiva idea perché non sono tenuti da nessuna parte.
I valori predefiniti utilizzati saranno quelli definiti nel tipo statico (in fase di compilazione). Quindi, se dovessi cambiare i parametri predefiniti in una sostituzione, ma hai chiamato la funzione tramite un puntatore o riferimento di classe base, verrebbero utilizzati i valori predefiniti nella base.
#include <iostream>
struct Base
{
virtual ~Base(){ }
virtual void foo(int a=0) { std::cout << "base: " << a << std::endl; }
};
struct Derived : public Base
{
virtual ~Derived() { }
virtual void foo(int a=1) { std::cout << "derived: " << a << std::endl; }
};
int main()
{
Base* derived = new Derived();
derived->foo(); // prints "derived: 0"
delete derived;
}
Per capire come funziona, il valore predefinito è compilato nel sito di chiamata (dove è noto solo il tipo statico), quindi il compilatore traduce effettivamente 'derived-> foo()' in 'derived-> foo (0)' a compilare il tempo. –
Dare funzioni virtuali initializers argomento predefinito tende a sconfiggere il polimorfismo e introdurre inutili complessità in una gerarchia di classe.
considerare il seguente codice non conforme
class Thing {
public:
virtual ~Thing();
virtual void doItNTimes(int numTimes = 10);
virtual void doItThisHigh(double howHigh = 1.0);
// ...
};
class MyThing : public Thing {
public:
void doItNTimes(int numTimes);
void doItThisHigh(double howHigh = 2.2);
// ...
};
Un inizializzatore di default non è parte del tipo di una firma di funzione e non partecipa a priorità assoluta o nascondersi. Pertanto, entrambe le funzioni virtuali della classe base mostrate in questo esempio di codice non conforme vengono sovrascritte nella classe derivata. Tuttavia, le differenze nello stato degli inizializzatori degli argomenti predefiniti nella classe base e nelle interfacce di classe derivate provocano differenze nel comportamento a seconda dell'interfaccia utilizzata per accedere a un oggetto.
MyThing *mt = new MyThing;
Thing *t = mt;
t->doItNTimes(); // default of 10
mt->doItNTimes(); // compile time error!
t->doItThisHigh(); // default of 1.0!
mt->doItThisHigh(); // default of 2.2
In questo pezzo di codice, l'intenzione del progettista della classe MyThing non è chiaro. Presumibilmente, è importante che il valore predefinito di doItThisHigh per un oggetto di tipo MyThing sia 2.2. Tuttavia, non è chiaro se tale valore debba essere utilizzato anche di default quando un MyThing viene manipolato attraverso la sua interfaccia Thing.
Per maggiori dettagli si rimanda al link qui sotto https://www.securecoding.cert.org/confluence/display/cplusplus/OOP04-CPP.+Prefer+not+to+give+virtual+functions+default+argument+initializers
- 1. Ereditarietà delle funzioni virtuali
- 2. Parametri predefiniti per limitare le funzioni (amp)
- 3. Principio delle funzioni virtuali in C++
- 4. Uso pratico delle funzioni virtuali in C#
- 5. C++: funzioni virtuali private vs. funzioni virtuali puri
- 6. Domanda con funzioni virtuali
- 7. funzioni virtuali oggetto affettare
- 8. asincrone funzioni programmic e virtuali
- 9. Gli argomenti delle funzioni predefiniti possono "riempire" per i pacchetti di parametri espansi?
- 10. Prestazioni delle funzioni virtuali chiamate da classi derivate?
- 11. Qual è l'equivalente delle funzioni virtuali di C++ in PHP?
- 12. Quali sono gli usi delle funzioni virtuali pure in C++?
- 13. C# Parametri predefiniti
- 14. Parametri predefiniti di symfony2
- 15. parametri predefiniti in node.js
- 16. RhinoMocks - Parametri di recupero delle funzioni richiamate
- 17. overloading delle funzioni con parametri const
- 18. override di funzioni non virtuali
- 19. funzioni virtuali imperativi e nascondere
- 20. Perché utilizzare le funzioni virtuali?
- 21. Può funzioni virtuali essere inline
- 22. OCaml: valori predefiniti per gli argomenti delle funzioni?
- 23. Perché le funzioni virtuali in C++ sono chiamate "virtuali"?
- 24. Collegamento di parametri con chiusure javascript ai parametri predefiniti nelle funzioni anonime
- 25. Gli aggregati C++ non hanno funzioni virtuali?
- 26. come determinare sizeof class con funzioni virtuali?
- 27. Valori predefiniti della matrice di funzioni PHP?
- 28. Domanda di polimorfismo/ereditarietà C++: ridefinizione delle funzioni di base vs funzioni virtuali
- 29. Unity constructor con parametri predefiniti
- 30. Scala parametri predefiniti e nulli
Avete qualche esempio di codice? –