2010-12-01 4 views
5

J'essaye mon premier programme orienté objet utile avec une certaine utilisation d'espace de noms. J'ai une classe de base B qui se trouve dans l'espace de noms NS. Si j'essaie d'hériter de cette classe de base pour que l'héritage fonctionne, je devrais utiliser le NS :: B dans la classe decleration comme ci-dessous, est-ce vraiment le cas? Ou y a-t-il un sytle plus largement accepté pour cette syntaxe d'héritage?héritage et espaces de noms

namespace NS 
{ 
    class D: public NS::B{ 
    ... 
    }; 
} 

Best, Umut

Répondre

7

Si votre D est en namespace NS, vous ne devez pas se qualifier NS::B, depuis D et B sont dans le même espace. Vous pouvez simplement utiliser class D : public B.

7

Lorsque vous êtes à l'intérieur de l'espace de noms NS, vous n'avez pas habituellement (1) nécessité de qualifier les noms des fonctions, des classes, ou d'autres entités qui se trouvent dans l'espace de noms NS. Étant donné:

namespace NS { 
    class B { }; 
} 

les deux définitions suivantes des D sont les mêmes:

namespace NS { 
    class D : public NS::B { }; 
} 

et:

namespace NS { 
    class D : public B { }; 
} 

(1) Recherche Argument-dépendante (ADL) peut causer certains ugly issues, en particulier lorsque vous utilisez des modèles, et pour les corriger, vous devrez peut-être qualifier les noms.

+0

Je suppose que je l'ai fait une erreur quelque part dans le makefile, ce est ce que je m'attendrais aussi, merci pour les réponses de toute façon. –

+0

en compilant un mauvais fichier –

+0

@Umut: vous pouvez toujours essayer simple "what if" demandes de renseignements comme celui-ci dans un seul fichier minimal. –

1

Vous ne devez indiquer NS puisque vous êtes déjà à l'intérieur

namespace NS 
{ 
    class D: public B{ //is fine 
    }; 
} 

autre chose que vous pourriez trouver intéressant plus tard est-:

#include <iostream> 
int x = 10; 

int main() 
{ 
    int x = 5; 
    //This will show the local x 
    std::cout << x << std::endl; 
    //This is how you access the Global x 
    std::cout << ::x << std::endl; 

    return 0; 
} 
Questions connexes