2010-08-28 106 views
3

我有此C++怪異鑽石繼承問題

A 
/ \ 
B  C 
    \ /
    D 

A具有純虛函數,原型如下:

virtual A* clone(void) const = 0; 

B和C從A幾乎繼承(class B: public virtual Aclass C: public virtual A

B具有虛擬功能,原型如下:

virtual B* clone(void) const {}; 

C具有虛擬函數,原型如下:

virtual C* clone(void) const {}; 

d從兩個B &Ç像繼承:class D: public B, public C d具有虛擬函數,原型如下:

virtual D* clone(void) const {}; 

現在,當編譯我得到以下6行錯誤:

error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const' 

沒有fre aking的想法如何解決這個問題。

在此先感謝。

+0

「我得到以下6行錯誤:」你錯過了其他5。 – 2010-08-28 22:06:14

+0

我的意思是,我得到了5次完全相同的錯誤... – snoofkin 2010-08-28 22:07:57

+0

哦,我忘了奇怪的C++編譯器錯誤可能是... – 2010-08-28 22:12:20

回答

1

避免菱形繼承? ; - >

反正這裏是樣品(樣品真的 - 不投像)

// ConsoleCppTest.cpp:定義控制檯應用程序的入口點。 //

#include "stdafx.h" 
#include "iostream" 

class A { 
public: 
    virtual void* clone() = 0; 
}; 

class B: public A { 
public: 
    virtual void* clone() = 0; 
}; 

class C: public A { 
    public: 
    virtual void* clone() = 0; 
}; 

class D: public B, public C 
{ 
public: 


    virtual void* B::clone() 
    { 
     std::cout << "B"; 
     return (void*)this; 
    } 

    virtual void* C::clone() 
    { 
     std::cout << "C"; 
     return (void*)this; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    D* d = new D(); 

    void* b = ((B*)d)->clone(); 

    void* c = ((C*)d)->clone(); 

    return 0; 
} 
+0

D類定義中的函數名稱是非法的。這是什麼意思:'B :: clone','D'中的'C :: clone'? – AnT 2010-08-28 22:36:17

+0

@AndreyT我編譯它,螞蟻它的作品 - 輸出是BC - 這並不漂亮,但鑽石繼承並不漂亮。 – nilphilus 2010-08-28 22:42:22

+0

嗯,我不知道你在用什麼樣的編譯器,但上面的代碼不是C++。在C++中,當在類中聲明函數時,不能使用限定名(比如'B :: clone')。 – AnT 2010-08-28 23:14:46

9

如果您只希望層次結構中父項的一個副本,請使用虛擬繼承。

class B : public virtual A 

編輯:
有可能是在MSVC++ 2010中的錯誤的智能感知未檢測到問題,但是編譯器扼流圈就可以了。奇怪,因爲VC6很開心。

作爲一種解決辦法,如果你聲明d如下,它使MSVC++ 2010快樂,同時也編譯器不工作這個問題:

class D: public virtual A, public B, public C 
+0

我現在沒有^^^ – nilphilus 2010-08-28 22:11:21

+2

但這正是OP已經在做的事情。 – AnT 2010-08-28 22:32:39

+1

IntelliSense認爲代碼沒有問題,因爲Visual C++ 2010 IntelliSense使用EDG前端,而不是Visual C++前端。我剝了下來@ AndreyT的例子來重現問題所需的微量,並報告了一個錯誤:https://connect.microsoft.com/VisualStudio/feedback/details/590625/visual-c-incorrectly-reports-ambiguity-when-covariance -is使用的與 - 虛擬繼承。 – 2010-08-29 03:29:50

5

您在原始帖子中描述的內容完全合法。 ,做一個快速的示例代碼正是編譯未經科莫在線編譯器的任何錯誤

class A { 
public: virtual A* clone() const = 0; 
}; 

class B: public virtual A { 
public: virtual B* clone() const { return 0; } 
}; 

class C: public virtual A { 
public: virtual C* clone() const { return 0; } 
}; 

class D: public B, public C 
{ 
public: virtual D* clone() const { return 0; } 
}; 

要麼你不這樣做,你在做什麼,你說的,或者你的編譯器壞了。發佈你正在編譯的真實代碼。

P.S.我只是試着在VS 2010 Express中編譯這個,並得到相同的錯誤。正如Gunslinger47在評論中所暗示的那樣,這是VS 2010編譯器中的一個錯誤。

+0

看起來像MSVC++ 2010的問題。 – Gunslinger47 2010-08-28 22:55:02