6

Ist es möglich, zwei Basisklassen zu erben, die denselben Namen haben, wenn sie sich in verschiedenen Namespaces befinden?C++: Erben von zwei Basisklassen mit demselben Namen, unterschiedlicher Namespace

By the way, plane ich zu diesem Zeitpunkt nicht diese auf zu tun, aber ich war neugierig:

class SuperShape : Physics::Shape, Graphics::Shape 
{ 
    // constructor 
    SuperShape(int x, int y, float color) : ???(x, y), ???(color); 
} 
+0

übrigens vergessen, in der Vererbung "öffentlich" "geschützt" oder "privat" zu erwähnen. – snoofkin

+3

@ soulSurfer2010: Es ist nicht notwendig "öffentlich", "geschützt" oder "privat" anzugeben. In diesem Fall wird standardmäßig "privat" gewählt, da es sich um eine "Klasse" handelt. Für eine "struct" wird standardmäßig "public" verwendet. Persönlich gebe ich immer explizit den Zugriffsmodifizierer an, aber der OP-Code ist C++ in Bezug auf die Angabe von Basisklassen gültig. –

+0

Betreff: "Ist es möglich, zwei Basisklassen zu erben, die denselben Namen haben, wenn sie sich in verschiedenen Namespaces befinden?" Die Antwort ist JA, weil * sie unterschiedliche Namen haben * –

Antwort

9

Sicher, warum nicht? Nichts hindert Sie daran. Hier ist ein funktionierendes Beispiel:

#include <iostream> 
#include <typeinfo> 
#include <string> 

namespace NS1 { 

class MyClass { 
public: 
    MyClass (const std::string &) {} 
}; 

} 

namespace NS2 { 

class MyClass { 
public: 
    MyClass (int) {} 
}; 

} 

class MyClass : 
    public NS1::MyClass, 
    public NS2::MyClass 
{ 
public: 
    MyClass() : 
     NS1::MyClass (std::string ("Hello")), 
     NS2::MyClass (1986) 
    {} 
}; 

int main() 
{ 
    MyClass clazz; 
    std::cout << typeid (NS1::MyClass).name() << std::endl; 
    std::cout << typeid (NS2::MyClass).name() << std::endl; 
    std::cout << typeid (clazz).name() << std::endl; 
} 
+0

fast alle waren gute Antworten, aber diese war die gründlichste. Danke an alle! –

+0

Wie führt man 'constructor' Syntax in diesem Fall? – fnc12

1

Physik :: Form & Graphics :: Form jeweils?

7

Klassen in unterschiedlichen Namensräumen tatsächlich tun unterschiedliche Namen haben (so weit wie C++ betroffen ist), auch wenn der letzte Teil des Namens (Shape in Ihrem Beispiel) könnte die gleiche sein. Die Namensauflösung wird unter dem vollständigen Namen durchgeführt, einschließlich aller Namespaces.

9

Nun, ganz einfach:

SuperShape(int x, int y, float color) 
    : Physics::Shape(x, y), Graphics::Shape(color) 
{ 
} 
2

Ja. Die Mem-Initialisierer des Konstruktors müssen qualifizierte Namen verwenden.

SuperShape::SuperShape(int x, int y, float color) 
    : Physics::Shape(x, y), Graphics::Shape(color) 
{ /*...*/ } 
0

Niemand erwähnte, dass dies der einzige Grund ist, dass Namespaces existieren. :)

+3

Dies ist nicht der einzige Grund, warum Namespaces existieren. –

Verwandte Themen