2012-12-09 23 views
5

Dire che ho le seguenti classi:Posso fare l'alias di un membro di una classe base in una classe derivata?

template <class T> 
class Base { 
    protected: 
    T theT; 
    // ... 
}; 

class Derived : protected Base <int>, protected Base <float> { 
    protected: 
    // ... 
    using theInt = Base<int>::theT;  // How do I accomplish this?? 
    using theFloat = Base<float>::theT; // How do I accomplish this?? 
}; 

Nella mia classe derivata, vorrei fare riferimento a Base::theT utilizzando un nome più intuitivo che rende più senso nella classe derivata. Sto usando GCC 4.7, che ha una buona copertura delle funzionalità di C++ 11. C'è un modo di usare una dichiarazione using per realizzare questo tipo di come ho provato nel mio esempio sopra? So che in C++ 11, la parola chiave using può essere usata per i tipi di alias così come per es. portare i membri della classe base protetti nella portata pubblica. Esiste un meccanismo simile per l'aliasing di un membro?

+4

Penso che sia necessario riferimenti o probabilmente piuttosto una funzione che non occuperà spazio nella classe derivata. : | – Xeo

+0

Grazie, la referenza ha funzionato. –

risposta

6

La punta di Xeo ha funzionato. Se si utilizza C++ 11, è possibile dichiarare gli alias in questo modo:

int &theInt = Base<int>::theT; 
float &theFloat = Base<float>::theT; 

Se non si dispone di C++ 11, penso che si può anche loro inizializzazione nel costruttore:

int &theInt; 
float &theFloat; 
// ... 
Derived() : theInt(Base<int>::theT), theFloat(Base<float>::theT) { 
    theInt = // some default 
    theFloat = // some default 
} 

MODIFICA: Il leggero fastidio è che non è possibile inizializzare il valore di quei membri con alias fino al corpo principale del costruttore (cioè all'interno delle parentesi graffe).

+3

Si noti che questo aumenta la dimensione della classe derivata da 'sizeof (void *)' volte il numero di riferimenti. Ecco perché ho incluso il suggerimento di una semplice funzione getter che si chiama 'theXXX'. – Xeo

+0

Sì, suppongo che tu abbia ragione. Fortunatamente, non credo che 8 byte aggiuntivi mi uccideranno dato che non ho molte istanze della classe Derived, quindi posso seguire la versione di riferimento più facile da usare quando accedo al membro dei dati. –

Problemi correlati