2012-03-18 85 views
2

我正在開發一個用於內部和外部使用的api。在Visual Studio 10.虛擬繼承和委託實現

我有一個虛擬基類IA和派生的虛擬基類IB。我用A類實現IA,然後從B中推導出IB的具體實現。這對我的理解是經典的鑽石問題。所以我做IA的繼承虛擬與同爲A的燒烤繼承,但我得到一個警告c4250 (warning C4250: 'B' : inherits 'A::A::AnInt' via dominance)

  • 而這個警告接縫指示編譯器做我想我是在警告不舒服什麼,想要確保#pragma out是安全的,或者有一些我不知道的問題。

的代碼的問題

class IA 
{ 
public: 
    virtual int AnInt() = 0; 
}; 

class A : virtual public IA 
{ 
public: 
    virtual int AnInt() 
    { 
     return 3; 
    } 
}; 

class IB : virtual public IA 
{ 
public: 
    virtual int AnInt2() = 0; 
}; 

class B : public A, public IB 
{ 
public: 
    int AnInt2() 
    { 
     return 4; 
    } 
}; 

第二部分。如果您正在創建api,那麼消費開發人員將無法更改相關的抽象類。你應該避免使用繼承來設計接口,或者繼續使派生類使用虛擬繼承。

回答

1

此問題已被討論previously。 Dani van der Meer的回答專門解決了這個問題。它已被提交爲自2005年以來不會在Visual Studio中修復bug report

如果您不是禁用警告的粉絲,則始終可以使功能選擇明確。

class B : public IB, public A 
{ 
public: 
+ int AnInt() 
+ { 
+  return A::AnInt(); 
+ } 

    int AnInt2() 
    { 
     return 4; 
    } 
}; 
0

我有類似的問題。
我使用MSVC2010

我結束了創建一個單獨的文件中指定的授權(因爲這將是所有公共導出),以克服警告 它的任何評論,這是不好的或不認識

class iCommon //pure virtual 
{ 
virtual void Foo()=0; 
} 

class iDerived: virtual iCommon //pure virtual... intended to allow testing with mocks 
{ 
virtual void Bar()=0; 
} 

class CommonImpl : virtual public iCommon 
{ 
virtual void Foo(){/* do common stuff*/} 
} 

class Derived: virtual public CommonImpl,virtual public iDerived 
{ 
    //implement the derived functionality 
    virtual void Bar(){/* this method is not common*/} 
//now load the file to avoid compiler warnings 
    #include "CommonImpl.delegate" 
} 

「CommonImpl.delegate」的內容

virtual void Foo() overload {return CommonImpl::Foo();}