Ho una classe C++ astratta senza costruttore. Dovrebbe essere una classe base in modo che altre classi possano ereditarla. Quello che sto cercando di fare è dichiarare una variabile costante nella classe base e inizializzarla in ogni costruttore di classe derivata, ma in nessun'altra parte in ciascuna di queste classi. È legale in C++? Se è così, come posso farlo?Come posso inizializzare una variabile const di una classe base in un costruttore di classi derivate in C++?
13
A
risposta
19
È legale in C++?
No. La costante mosto essere inizializzato nel costruttore della classe base.
La soluzione è fornire un costruttore appropriato nella classe base, altrimenti non può essere utilizzato. Inoltre, non c'è motivo per non fornire quel costruttore.
class Base {
int const constant;
public:
virtual ~Base() = 0; // Makes this an abstract base class.
protected:
Base(int c) : constant(c) { }
};
// Must be implemented!
Base::~Base() { }
class Derived : public Base {
public:
Derived() : Base(42) { }
};
0
Perché non fate un costruttore protetto nella classe base astratta e impostare il valore costante lì?
1
Se a tutto quello che dovete fare in questo modo:
struct Base {
Base(std::string const & someValue)
: const_value(someValue) {
}
protected:
std::string const const_value;
};
struct Derived : Base {
Derived()
: Base("Derived"){
}
};
La ragione di questo è che è consentito solo per assegnare valori a un valore const in fase di inizializzazione. Una volta inizializzata la Base, non è più possibile modificare il valore. Quindi devi farlo in questo modo come mostrato sopra.
Problemi correlati
- 1. Come posso creare dinamicamente classi derivate da una classe base
- 2. Evento eventi di classe base in classi derivate C#
- 3. Copia C++ di due classi derivate
- 4. Quando e come inizializzare di default una variabile const?
- 5. Come inizializzare correttamente una variabile const const const?
- 6. Come inizializzare un campo const nel costruttore?
- 7. Come inizializzare una variabile const all'interno di una struct in C?
- 8. Riflettere classi derivate in C#
- 9. Come inizializzare const in una struttura in C (con malloc)
- 10. Come inizializzare un membro const const in C++?
- 11. C#: Aggiunta di metodi di estensione di una classe base in modo che appaiono nelle classi derivate
- 12. Visualizzazione delle classi derivate in C#
- 13. Effetti di una classe base const
- 14. Come funzionano i costruttori di classi derivate in python?
- 15. Come inizializzare una classe?
- 16. Posso fare l'alias di un membro di una classe base in una classe derivata?
- 17. Come inizializzare un vettore di una coppia di stringhe, una stringa in una classe C++?
- 18. come forzare i costruttori della classe base da chiamare nelle classi derivate?
- 19. Proibire la definizione di un costruttore di copie in una classe ereditata
- 20. Come impedire che una classe astratta con classi derivate pubbliche venga ereditata in altri assembly?
- 21. uguaglianza di prova per le classi derivate in C++
- 22. Sovrascrivere le costanti nelle classi derivate in C#
- 23. Come inizializzare un vettore std :: in un costruttore di classi in C++?
- 24. Classi di base qualificate CV in C++
- 25. Memorizzazione di un metodo come una variabile membro di una classe in C#
- 26. Come si può progettare una classe base, quindi conosce tutte le classi "derivate" in fase di esecuzione?
- 27. C++ Boost serializzazione serializzazione di classi derivate templated
- 28. Come inizializzare una matrice di dimensioni variabili in una classe C++?
- 29. C++ in cui inizializzare static const
- 30. Posso trasmettere una classe derivata a una classe base privata, usando il cast in stile C?
Se si rende 'protetto il costruttore di classi base ', non ci si deve preoccupare di nessun altro che lo instanzia direttamente. – Zooba
Ho pensato che se c'è un costruttore in una classe base astratta, non è più astratto perché può essere istanziato. Ho sbagliato? – user246392
@Zooba: corretto. Vedi il mio codice aggiornato. ;-) Inoltre, ci sono altri modi per rendere un abstract di classe base (vale a dire irrinunciabile). Il modo standard è di fornire una funzione virtuale pura (ad esempio, convenientemente il distruttore, che ** deve ** essere virtuale in ogni caso). –