在這個例子中,我對應用多態性有一些麻煩。這個問題類似於我的最後一個問題C++,vs 2010中模糊的繼承錯誤
C++, virtual inheritance, strange abstract class + clone problem
有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
上述的錯誤發生2繼承的類僅使用MSVS 2010編譯器,g ++編譯此代碼即可。
類圖(簡化的)
.......... A .... B.....
........../.\..../......
........./...\../.......
......../.....\/........
.......D...... C........
........\...../.........
.........\.../..........
..........\./...........
...........E............
最後討論中,我們關閉與結果:從類C.使用多態需要
class C: virtual public A , public B
{
public:
//virtual C * copy() const = 0; //remove declaration
virtual ~C() = 0;
};
C::~C(){}
我的示例代碼刪除複製()方法的聲明創建指向C的向量。刪除某些元素後,我想創建它的副本...我需要在C類中聲明copy(),因此刪除聲明是不夠的,也不能解決問題。
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可翻譯的代碼?
在您最喜愛的C++書籍,FAQ或參考站點中查找'virtual'繼承。同時在網上搜索「C++ dreaded diamond inheritance」。 –
我知道這個問題......但它是如何與我的問題相關的?此代碼是正確的,但MSVS 2010不編譯它,但是g ++ ant編譯器是... – Johnas