C++: наследование двух базовых классов с одинаковым именем, разным пространством имен
можно ли наследовать два базовых класса с одинаковым именем, если они находятся в разных пространствах имен?
кстати, я не планирую в это время делать это, но мне было любопытно:
class SuperShape : Physics::Shape, Graphics::Shape
{
// constructor
SuperShape( int x, int y, float color) : ???( x, y ), ???( color );
}
6 ответов
конечно, почему бы и нет? Ничто не мешает вам сделать это. Вот рабочий пример:
#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;
}
ну, просто :
SuperShape( int x, int y, float color)
: Physics::Shape( x, y ), Graphics::Shape( color )
{
}
классы в разных пространствах имен на самом деле do имеют разные имена (что касается C++), хотя последняя часть имени (Shape
в вашем примере) может быть таким же. Разрешение имен выполняется на полное имя, включая все пространства имен.
да. Инициализаторы mem конструктора должны будут использовать квалифицированные имена.
SuperShape::SuperShape( int x, int y, float color )
: Physics::Shape( x, y ), Graphics::Shape( color )
{ /*...*/ }