C++, неоднозначная ошибка наследования в vs 2010
у меня есть некоторые проблемы с применением полиморфизма в данном примере. Этот вопрос похож на мой последний вопрос
C++, виртуальное наследование, странный абстрактный класс + проблема клонирования
есть 3 абстрактных класса:
class A
{
public:
virtual A * copy () const = 0;
virtual ~A() = 0;
};
A::~A(){}
class B
{
public:
virtual B * copy () const = 0;
virtual ~B() = 0;
};
B::~B(){}
class C: virtual public A , public B
{
public:
virtual C * copy () const = 0;
virtual ~C() = 0;
};
C::~C(){}
и два унаследованных класса с использованием виртуального наследования
class D: virtual public A
{
public:
virtual D * copy () const {return new D (*this);}
virtual ~D() {}
};
class E: virtual public D , public C
{
public:
virtual E * copy () const {return new E (*this);}
virtual ~E() {}
}; //Error C2250: 'E' : ambiguous inheritance of 'D *A::copy(void) const
вышеупомянутая ошибка возникает только с помощью компилятора MSVS 2010, G++ компилирует этот код ЛАДНО.
диаграмма классов (упрощенный)
.......... A .... B.....
........../...../......
........./...../.......
......../...../........
.......D...... C........
............./.........
............/..........
.........../...........
...........E............
последнее обсуждение мы закрываем с результатом: удалите объявление метода copy () из класса C.
class C: virtual public A , public B
{
public:
//virtual C * copy () const = 0; //remove declaration
virtual ~C() = 0;
};
C::~C(){}
мой пример кода с использованием полиморфизма должен создать вектор указателей на C. После удаления некоторого элемента я хочу создать его копию... Мне нужно объявление copy () в классе C, поэтому удаление объявления недостаточно, и это не решает проблему.
int main(int argc, char* argv[])
{
std::vector <C*> items;
items.push_back(new E());
items.push_back(new E());
items[0]->copy();
return 0;
}
не могли бы вы помогите мне, пожалуйста, как исправить код для перевода с помощью VS 2010?
1 ответов
Это известная ошибка в Visual C++:
вам либо нужно устранить ковариацию, либо виртуальное наследование. К сожалению, вы не можете иметь оба.