7
votes

Une déclaration d'utilisation est-elle censée masquer une fonction virtuelle héritée?

int main()
{
    level3 l3;
    l3.foo();               // This prints level1

    level3* pl3 = &l3;
    pl3->foo();             // This prints level2

    level3& rl3 = l3;
    rl3.foo();              // This prints level1

    level3& rpl3 = *pl3;
    rpl3.foo();             // This prints level2

    return 0;
}

4 commentaires

Je suppose que GCC est correct, mais je ne suis pas sûr.


J'ai confirmé le comportement avec TDM Mingw G ++ 4.4.1. C'est un bug g ++, veuillez le signaler. Acclamations et hth.,


Drôle, je me penche juste dans cet hier.


Ceci a été corrigé dans GCC 4.8.


3 Réponses :


0
votes

Le moyen de get de niveau1 de niveau1 serait bien sûr:

struct level3 : level2
{
   virtual void foo() { level1::foo(); }
};


0 commentaires

1
votes

à l'aide de niveau1 :: FOO; introduit une fonction FOO dans Niveau3 classe qui fait référence à niveau1 :: foo .

Dans une déclaration d'utilisation utilisée en tant que déclaration de membre, le spécificité de nom imbriquée nomme une classe de base de la classe étant définie. Une telle utilisation-déclaration introduit l'ensemble des déclarations trouvées par Nom de membre Recherche.

Cependant, depuis niveau1 :: foo est virtuel, je suppose que, en l'appelant, vous devez appeler niveau2 :: FOO , donc ICC devrait avoir raison.

Je ne suis pas si sûr, de toute façon.


0 commentaires

5
votes

Un exemple de la section standard 10.3P2 indique clairement qu'à utiliser les déclarations pas remplacement des fonctions virtuelles.

Ceci est un connu g ++ bug .

Comme vous l'avez remarqué, lorsque vous appelez la fonction de membre via une référence ou un pointeur, plutôt qu'un cas dans lequel le type dynamique est connu, le bogue ne se produit pas.


1 commentaires

+1 Pour une citation standard, comme pour le bogue: signalé en 2004, dernière mise à jour en 2006 -> Je suppose que personne ne se soucie vraiment de l'œuvre facile autour de :)