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?
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++". –
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