2011-08-12 6 views
2

J'ai reçu un diamant. Je veux accéder au membre de la classe. J'utilise mingw.
Question est: Comment accéder à un membre "top :: A" sans classe redéclarantAccès à un membre de classe ambigu

#include <cstdio> 
class top { 
public: 
    const char A; 
    top(): A('t') {} 
}; 
class left: public top { 
public: 
    const char A; 
    left():A('l'){} 
}; 
class right: public top {}; 
class bottom: public left, public right {}; 

int main() { 
    bottom obj; 
    printf("%c\n", obj.bottom::right::A); //using right::A, inherited from top::A 
    printf("%c\n", obj.bottom::left::A); //using left::A and left::top::A is hidden 
    //printf("%c\n", obj.bottom::left::top::A); //error. How to access it? 
    return 0; 
} 

Quand je Supprimer le commentaire MinGW me donne une erreur:

'top' is an ambiguous base of 'bottom' 

Mise à jour: On dirait que types de moulage travaux:

printf("%c\n", static_cast<top>(static_cast<left>(obj)).A); 
printf("%c\n", static_cast<left>(obj).::top::A); 
printf("%c\n", reinterpret_cast<top&>(obj).A);//considered bad 
printf("%c\n", (reinterpret_cast<top*>(&obj))->A);//considered evil 
//  printf("%c\n", static_cast<top&>(obj).A);//error 
+0

Aussi, n'a pas de diamants dans votre héritage. C'est mauvais. –

+0

Voulez-vous savoir à propos de l'héritage virtuel, ou voulez-vous réellement savoir comment accéder aux deux copies séparées, non-virtuelles de 'top'? –

+0

@Kerrek veut réellement comment accéder à deux copies distinctes non-top de top, car la mémoire le contient. – all

Répondre

4

Sans l'héritage virtuel, vous pouvez masser le type un peu pour convaincre le compilateur de choisir la classe de base correcte:

printf("%c\n", static_cast<left&>(obj).::top::A); 
2

Je ne suis pas tout à fait le gourou C++, mais peut-être pas le travail suivant? Voir le Manuel de référence annoté C++, section 10.11c.

left &asLeft = obj ; 
top &asTop = asLeft ; 
cout << asTop.A << endl ; 
Questions connexes