2010-12-01 12 views
5

Ich versuche mein erstes nützliches objektorientiertes Programm mit einigen Namespace-Nutzung. Ich habe eine Basisklasse B, die im Namensraum NS ist. Wenn ich versuche, von dieser Basisklasse zu vererben, um die Vererbung zu bekommen, sollte ich das NS :: B in der Klasse declleration wie unten benutzen, ist das wirklich der Fall? Oder gibt es eine allgemein akzeptierte Formel für diese Vererbungssyntax?Vererbung und Namespaces

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

Best, Umut

Antwort

7

Wenn Ihr D in namespace NS ist, müssen Sie NS::B nicht qualifizieren, da D und B sind im gleichen Namensraum. Sie können einfach class D : public B verwenden.

7

Wenn Sie innerhalb von Namespace sind NS, die Sie nicht in der Regel (1) Notwendigkeit, die Namen von Funktionen, Klassen zu qualifizieren, oder anderen Einheiten, die NS im Namensraum sind. Gegeben:

namespace NS { 
    class B { }; 
} 

die folgenden zwei Definitionen von D sind die gleichen:

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

und:

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

(1) Argument-Dependent Lookup (ADL) kann dazu führen, einige ugly issues, vor allem bei der Verwendung von Vorlagen, und um sie zu beheben, müssen Sie möglicherweise Namen qualifizieren.

+0

Ich glaube, ich in der Make-Datei irgendwo einen Fehler haben, diese ist, was ich auch erwarten würde, danke für die Antworten sowieso. –

+0

durch kompilieren einer falschen Datei –

+0

@Umut: Sie können immer versuchen, einfache "what if" -Anfragen wie diese in einer minimalen einzelnen Datei. –

1

You dont NS bezeichnen müssen, da Sie bereits sind im Inneren

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

Etwas anderes könnte für Sie interessant später:

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