2012-03-18 107 views
0

比方說,我們有如下代碼:虛擬繼承和簽名重疊

struct A{ 
    virtual ~A(){} 

    void f(){ 
     p = 42; 
    } 

    int p; 
}; 

struct B : public virtual A{}; 
struct C : public virtual A{}; 
struct D : public B, public C, public A{}; //let's add non-virtual inheritance 

int main(){ 
    D* pA = new D(); 
    pA->A::f(); //! 

    return 0; 
} 

有什麼辦法,設P 42最基類? 以下建設pA-> A :: f();爲非虛擬繼承類A設置p爲42。我們可以在沒有轉換的情況下執行此操作嗎?

+0

究竟是什麼問題?繼承幾乎意味着你得到一個A的實例... – 2012-03-18 14:41:47

回答

3

首先,沒有演員:你只是有資格A哪個版本,因爲你有多個演員。當然,你選擇的符號實際上並不起作用,因爲它並不能解決首先存在的歧義問題。我猜你的意思是使用類似

pA->B::f(); 

如果你不想把選擇對你的類的用戶調用哪個成員函數的負擔,你必須爲D提供合適的轉發功能例如:

void D::f() { this->B::f(); } 
+0

我剛剛意識到我可以調用pA-> B :: A :: f(); :)這會改變最基類A的值。 – innochenti 2012-03-19 21:15:50

+0

您可以省略'A ::'部分:一旦您選擇了明確導致該功能的路徑的開始,則不需要進一步的限定。那麼,除非函數是虛擬的,並且你想確保你調用基本版本。 – 2012-03-19 21:27:07