6

¿Es posible heredar dos clases base que tengan el mismo nombre, si se encuentran en espacios de nombres diferentes?C++: Heredando dos clases base con el mismo nombre, espacio de nombres diferente

Por cierto, no estoy pensando en este momento sobre cómo hacer esto, pero tenía curiosidad:

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

por cierto, olvidó mencionar 'público' 'protegido' o 'privado' en la herencia. – snoofkin

+3

@ soulSurfer2010: No es necesario indicar 'public',' protected' o 'private'. En este caso, el valor predeterminado es 'privado' ya que es una' clase'. Para una 'struct', su valor predeterminado es' public'. Personalmente, siempre declaro explícitamente el modificador de acceso, pero el código del OP es válido C++ con respecto a indicar las clases base. –

+0

Re: "¿Es posible heredar dos clases base que tienen el mismo nombre, si están en diferentes espacios de nombres?" La respuesta es SÍ, porque * tienen diferentes nombres * –

Respuesta

9

Claro, ¿por qué no? Nada te impide hacerlo. Aquí hay un ejemplo de trabajo:

#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

casi todas fueron buenas respuestas, pero esta fue la más completa. ¡gracias a todos! –

+0

¿Cómo se realiza la sintaxis 'using contructor' en este caso? – fnc12

1

Física :: Forma & Gráficos :: Forma respectivamente?

7

clases en diferentes espacios de nombres realidad hacer tienen diferentes nombres (por lo que C++ es que se trate), a pesar de que la última parte del nombre (Shape en su ejemplo) podría ser el mismo. La resolución del nombre se realiza en el nombre totalmente calificado, incluidos todos los espacios de nombres.

9

Bueno, simplemente:

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

Sí. Los iniciadores de memoria del constructor tendrán que usar nombres calificados.

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

Nadie mencionó que esta es la única razón por la que existen espacios de nombres. :)

+3

Esta no es la única razón por la que existen espacios de nombres. –

Cuestiones relacionadas