6

在這個例子中,我對應用多態性有一些麻煩。這個問題類似於我的最後一個問題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可翻譯的代碼?

+1

在您最喜愛的C++書籍,FAQ或參考站點中查找'virtual'繼承。同時在網上搜索「C++ dreaded diamond inheritance」。 –

+0

我知道這個問題......但它是如何與我的問題相關的?此代碼是正確的,但MSVS 2010不編譯它,但是g ++ ant編譯器是... – Johnas

回答

7

這是在Visual C一個已知的bug ++:

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

你要麼需要消除的協方差或虛擬繼承。不幸的是,你不能兼得。

+0

感謝您的回答。如果我理解正確,所以錯誤將在下一個版本VS中得到糾正...是否有任何其他方式如何使用MSVS2010編譯代碼(編譯器設置...)? – Johnas

+1

不,這個錯誤被封爲「無法修復」,這意味着它在下一個版本中不會被修復。看起來,不可能使用Visual C++來編譯將虛擬繼承與協方差相結合的代碼。如果這對您來說是一個重要問題,請轉到該Connect錯誤,點贊它,點擊「N用戶可以重新編制此錯誤」下的「我也可以」按鈕,並發表評論。 –

+0

這很煩人。我們能否期待這個問題有時會得到解決?我沒有任何有關向微軟報告錯誤的經驗... – Johnas