C ++: наследование двух базовых классов с одинаковыми именами в разных пространствах имен - PullRequest
8 голосов
/ 23 декабря 2010

Можно ли наследовать два базовых класса с одинаковыми именами, если они находятся в разных пространствах имен?

Кстати, в настоящее время я не планирую делать это, но мне было любопытно:

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

Ответы [ 6 ]

10 голосов
/ 23 декабря 2010

Конечно, а почему нет? Ничто не мешает вам сделать это. Вот рабочий пример:

#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;
}
9 голосов
/ 23 декабря 2010

Ну, просто:

SuperShape( int x, int y, float color)
    : Physics::Shape( x, y ), Graphics::Shape( color )
{
}
7 голосов
/ 23 декабря 2010

Классы в разных пространствах имен на самом деле do имеют разные имена (что касается C ++), даже если последняя часть имени (Shape в вашем примере) может быть одинаковой. Разрешение имени выполняется для полного имени , включая все пространства имен.

2 голосов
/ 23 декабря 2010

Да. Mem-инициализаторы конструктора должны будут использовать квалифицированные имена.

SuperShape::SuperShape( int x, int y, float color )
    : Physics::Shape( x, y ), Graphics::Shape( color )
{ /*...*/ }
1 голос
/ 23 декабря 2010

Физика :: Форма и графика :: Форма соответственно?

0 голосов
/ 23 декабря 2010

Никто не упомянул, что это единственная причина существования пространств имен. :)

...