Come posso inizializzare una variabile const di una class base in un costruttore di classi derivate in C ++?

Ho una class C ++ astratta senza costruttore. Dovrebbe essere una class base in modo che altre classi possano ereditarla. Quello che sto cercando di fare è dichiarare una variabile costante nella class base e inizializzarla in ogni costruttore di class derivata, ma in nessun’altra parte in ciascuna di queste classi. È legale in C ++? Se è così, come posso farlo?

È legale in C ++?

No. La costante deve essere inizializzata nel costruttore della class base.

La soluzione è fornire un costruttore appropriato nella class 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) { } }; 

Se tutto ciò che devi 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 ciò è che è ansible assegnare valori a un valore const al momento dell’inizializzazione. Una volta inizializzata la Base, non è più ansible modificare il valore. Quindi devi farlo in questo modo come mostrato sopra.

Perché non si crea un costruttore protetto nella class base astratta e si imposta il valore costante lì?