2012-12-09 17 views
5

że mam następujące klasy:Czy mogę alias członka klasy bazowej w klasie pochodnej?

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?? 
}; 

W mojej klasie pochodnej, chciałbym odnieść się do Base::theT stosując bardziej intuicyjne nazwy, która ma większy sens w klasie pochodnej. Używam GCC 4.7, który ma całkiem dobry zasięg funkcji C++ 11. Czy istnieje sposób użycia oświadczenia using do realizacji tego rodzaju próbowałem w moim przykładzie powyżej? Wiem, że w C++ 11 słowo kluczowe using może być używane do aliasów typów, jak również np. zabrać chronionych członków klasy podstawowej do publicznego zasięgu. Czy istnieje podobny mechanizm aliasingu członka?

+4

Myślę, że potrzebujesz referencji lub raczej funkcji, która nie zajmie miejsca w klasie pochodnej. : | – Xeo

+0

Dzięki, referencja zadziałała. –

Odpowiedz

6

Porada Xeo zadziałała. Jeśli używasz C++ 11, można zadeklarować aliasy tak:

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

Jeśli nie masz C++ 11, myślę, że można również zainicjować je w konstruktorze:

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

EDYTOWANIE: Lekkie rozdrażnienie polega na tym, że nie można zainicjować wartości tych aliasów do czasu aż do głównej bryły konstruktora (tj. Wewnątrz nawiasów klamrowych).

+3

Należy zauważyć, że zwiększa to rozmiar klasy pochodnej o 'sizeof (void *)' razy liczbę odwołań. Dlatego zawarłem sugestię prostej funkcji gettera o nazwie 'theXXX'. – Xeo

+0

Tak, przypuszczam, że masz rację. Na szczęście nie sądzę, aby dodatkowe 8 bajtów zabiło mnie, ponieważ nie mam wielu instancji klasy Derived, więc mogę trzymać się łatwiejszej wersji wersji referencyjnej, gdy uzyskuję dostęp do elementu danych. –

Powiązane problemy