2012-11-27 17 views
6

Nella mia classe base ho una variabile int costante e mi piacerebbe inizializzarne la risposta nella mia classe derivata, con un valore diverso (preso come parametro), è possibile?C++ Inizializza la classe base 'const int nella classe derivata?

Ecco quello che ho fatto:

// Base.h (methods implemented in Base.cpp in the actual code) 
class Base { 
    public: 
     Base(const int index) : m_index(index) {} 
     int getIndex() const { return m_index; } 
    private: 
     const int m_index; 
}; 

// Derived.h 
class Derived : public Base { 
    public: 
     Derived(const int index, const std::string name) : m_name(name) {} 
     void setName(const std::string name) { m_name = name; } 
     std::string getName() const { return m_name; } 
    private: 
     std::string m_name; 
}; 

Ma ovviamente mi sta chiedendo Base::Base() che non esiste, e se io definisco, mi dovrà dare valore predefinito per m_index, che non mi voglio fare. Devo definire const int m_index separatamente in ogni classe derivata?

domanda simile, ma non sono sicuro se la statica influenza questo in alcun modo: C++ : Initializing base class constant static variable with different value in derived class?

risposta

13

Chiamate l'appropriato Base costruttore nella lista di inizializzazione s' il Derived:

Derived(const int index, const std::string name) : Base(index), m_name(name) {} 
+1

CHE COSA?!? Ho fatto C++ per 3 o 4 anni o qualcosa del genere, e non mi sono mai imbattuto in questo? Ho sempre pensato di dover usare il costruttore predefinito ... Grazie amico, accetterò tra un minuto. –

1

È può chiamare il costruttore base come questo:

class B1 { 
    int b; 
public:  
    // inline constructor 
    B1(int i) : b(i) {} 
}; 

class B2 { 
    int b; 
protected: 
    B2() {}  
    // noninline constructor 
    B2(int i); 
}; 

class D : public B1, public B2 { 
    int d1, d2; 
public: 
    D(int i, int j) : B1(i+1), B2(), d1(i) 
    { 
    d2 = j; 
    } 
}; 

Da c + +11 puoi persino usare costruttori della stessa classe. La funzione è chiamata delegare i costruttori.

Derived(){} 
Derived(const int index, const std::string name) : Derived() {} 
Problemi correlati