C ++, неоднозначная ошибка наследования в сравнении с 2010 - PullRequest
6 голосов
/ 04 августа 2011

У меня есть некоторые проблемы с применением полиморфизма в этом примере. Этот вопрос похож на мой последний вопрос

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 Ответ

8 голосов
/ 04 августа 2011

Это известная ошибка в Visual C ++:

Visual C ++ неправильно сообщает о неоднозначности при использовании ковариации с виртуальным наследованием

Вы либонеобходимо устранить ковариацию или виртуальное наследование.К сожалению, вы не можете иметь оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...