6

Mam pewne problemy z zastosowaniem polimorfizmu w tym przykładzie. To pytanie jest podobne do mojego ostatniego pytaniaC++, niejednoznaczny błąd dziedziczenia w porównaniu z 2010 r.

C++, virtual inheritance, strange abstract class + clone problem

Są 3 klasy abstrakcyjne:

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(){} 

i dwa odziedziczone ćwiczenia wykorzystujące dziedziczenie wirtualne

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 

Powyższa błąd występuje tylko przy użyciu kompilatora MSVS 2010, g ++ kompiluje ten kod OK.

Class Diagram (uproszczony)

.......... A .... B..... 
........../.\..../...... 
........./...\../....... 
......../.....\/........ 
.......D...... C........ 
........\...../......... 
.........\.../.......... 
..........\./........... 
...........E............ 

Ostatnia dyskusja zamkniemy z wynikiem: usunąć deklarację metodą copy() z klasy C

class C: virtual public A , public B 
{ 
public: 
    //virtual C * copy() const = 0; //remove declaration 
    virtual ~C() = 0; 
}; 

C::~C(){} 

Mój przykładowy kod korzystania potrzeb polimorfizmu aby utworzyć wektor wskaźników do C. Po usunięciu jakiegoś elementu chcę utworzyć jego kopię ... POTRZEBUJĘ deklaracji copy() w klasie C, więc usunięcie deklaracji jest niewystarczające i nie rozwiązuje problemu.

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; 
} 

Czy możesz mi pomóc, proszę, jak poprawić kod do tłumaczenia przy użyciu VS 2010?

+1

Wyszukiwanie dziedziczenia "wirtualnego" w ulubionej książce C++, często zadawanych pytaniach lub witrynie referencyjnej. Przeszukuj również sieć pod kątem "Dziedziczonego diamentowego dziedzictwa C++". –

+0

Znam ten problem ... Ale jak to się ma do mojego pytania? Ten kod jest poprawny, ale MSVS 2010 go nie kompiluje, jednak g ++ ant oher compilers yes ... – Johnas

Odpowiedz

7

To znany błąd w Visual C++:

Visual C++ incorrectly reports ambiguity when covariance is used with virtual inheritance

albo trzeba wyeliminować kowariancji lub wirtualny dziedziczenia. Niestety, nie możesz mieć obu.

+0

Dziękuję za odpowiedź. Jeśli rozumiem poprawnie, więc błąd zostanie poprawiony w następnym wydaniu VS ... Czy istnieje inny sposób, w jaki sposób skompilować kod przy użyciu MSVS2010 (ustawienia kompilatora ...)? – Johnas

+1

Nie, błąd został zamknięty jako "Nie naprawiam", co oznacza, że ​​nie zostanie naprawiony w następnym wydaniu. Wydaje się, że nie można używać Visual C++ do kompilowania kodu, który łączy dziedziczenie wirtualne z kowariancją. Jeśli jest to dla ciebie ważna kwestia, przejdź do tego błędu Connect, obejrzyj go, kliknij przycisk "I can too" pod "N użytkownicy mogą repro this bug" i zostaw komentarz. –

+0

To denerwujące. Czy możemy się spodziewać, że ten problem czasami zostanie naprawiony? Nie mam żadnego doświadczenia z zgłaszaniem błędów do Microsoftu ... – Johnas