2013-04-02 208 views
0

我有一個基類Number。類別OneTwo源自Number。 現在我定義另一個類Three,在這裏我需要從多重繼承訪問單個基類:訪問從兩個相同的基類派生的派生類的個別類


class Number{ 
    protected: 
    int val; 
    public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

//class One derived from Number 
class One:public Number{ 
    public: 
    One(){ 
      cal=1; 
    } 
}; 

//class two derived from Number 
class Two:public Number{ 
    public: 
    Two(){ 
      val=2; 
    } 
}; 

class Three:public One,public Two{ 
    public: 
    Three(){ 
      Two::Add(One);//--How can i pass instance of class One Here 
    } 
}; 

我試過一次::數與數::,但沒有用。

+0

'添加(一個)','一個'不是你的類的實例,而是類型本身。你需要一個'One'類型的變量。 –

回答

-1

這應該工作:

Two::Add(*(One*)this); 
+0

作品像一個魅力:) – HariHaraSudhan

+1

我最初發布了一個提示類型轉換作爲評論,但你必須認識到,當你解決這個問題時,你的類設計仍然存在嚴重的問題。 – dyp

+0

@DyP有基本類繼承兩次的合法用例。這顯然是一個簡化的例子,不可能分辨出真正的設計是否存在「嚴重問題」。 – Henrik

-1

您需要創建相應類型的對象。

class Three : public One, public Two 
{ 
public: 
    Three() 
    { 
      Add(One()); 
      Add(Two()); 
    } 
}; 

但是我不明白爲什麼你需要MI在這裏。從數字繼承就足夠了。

+0

我編輯了這個問題,我需要使用一個或兩個添加功能來添加另一個。 – HariHaraSudhan

0

有幾個問題,首先val是私人的,所以需要製作protected。接下來你有一個diamond of death所以你需要virtual publicOneTwo。您也嘗試使用type調用Add,但你需要在每個類的instance

class Number{ 
protected: 
    int val; 
public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number& n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

//class One derived from Number 
class One:virtual public Number{ 
public: 
    One(){ 
      val=1; 
    } 
}; 

//class two derived from Number 
class Two:virtual public Number{ 
public: 
    Two(){ 
      val=2; 
    } 
}; 

class Three: public One, public Two{ 
public: 
    Three() 
    { 
      Two t1 ; 
      Add(t1);//--How can i pass instance of class Two Here 
    } 
}; 

可以這樣說,使用protected數據是錯的,但它取決於on your case但要完成這也是一個選擇保持val一個private數據成員並使用protected constructor這將是這樣的:

class Number{ 
private: 
    int val; 
protected: 
    Number(int n) : val(n) {} 
public: 
    Number(){ 
     val=0; 
    } 
    void Add(Number& n){//Receives another Number class instance and add the value 
     val+=n.val; 
    } 
}; 

class One: virtual public Number{ 
public: 
    One() : Number(1) { 

    } 
}; 

class Two: virtual public Number{ 
public: 
    Two() : Number(2) { 
    } 
}; 
+0

我不會讓'val'保護它的唯一目的是將其設置在ctor中。你也可以創建一個受保護的'Number :: Number(int)'。 – dyp

+1

@DyP我相信這取決於您的使用案例,但我修改了我的答案,以涵蓋兩者以及相關問題。 –

-1

問題不僅僅是語法。但是你究竟想要做什麼?

您可以。但是One的實例在哪裏申明?你必須先申報。記住Two::Add(One);不是一個聲明而是一個調用語句。

,你在做什麼,就相當於讓我們說

process_number(One); 

如果進程號是一個函數。