2014-02-10 68 views
1

我有兩個基類--BaseA和BaseB以及派生類派生自BaseA和BaseB。多繼承C++ - 從派生類BaseA訪問BaseB變量

BaseB定義了一個變量int var(說)。 BaseA可以訪問變量var?我嘗試在BaseA中定義一個虛函數 - virtual int Variable()= 0,並定義int Variable(){return var; }在BaseB中。但這不起作用。

請告知什麼是達到此目的的最佳方法?

有許多派生類C具有不同的實現,我想避免在每個派生類中定義Set函數。

謝謝。

示例代碼 - http://ideone.com/hFjvua

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    int Add(int x) { return Get() + x; } 
    virtual int Get() = 0; 
}; 

class B 
{ 
public: 
    int Get() {return a;} 
protected: 
    int a; 
}; 


class C : public A, public B 
{ 
public: 
    void Set(int x) { a = x; } 
    //int Get() { return a; } 
}; 

int main() { 
    C c; 
    c.Set(5); 
    std::cout << c.Add(3) << std::endl; 
    return 0; 
} 
+2

1)不,'BaseA'將不能訪問'var',除非它的'static'或有一個'BaseB'指針 – yizzlez

回答

0

是,也不是。

如果您覆蓋BaseADerived的方法,那些方法可以訪問BaseB::var。如果你不覆蓋這些方法,BaseA的定義中的任何方法都不會對BaseB一無所知。

class A 
{ 
public: 
    virtual int Get() = 0; 
}; 

class B 
{ 
public: 
    int a; 
}; 

class C : public virtual A, public virtual B 
{ 
public: 
    int Get() { return a; } 
}; 

Example

+0

感謝。有可能實現http://ideone.com/hFjvua。我要問的原因 - >至少有20個類,比如C,我想避免在任何地方定義Get()函數。 – user2256532

+0

隨着代碼在你的嘗試,沒有。函數'A :: Get'和'B :: Get'完全不相關。您需要在B中定義一個虛擬方法來覆蓋:http://ideone.com/gqHteb然而,仍然需要您在「C」中覆蓋它。我的猜測是,你實際上不需要多重繼承(95%的時間,這是不必要的) - 你應該仔細看看你的設計,以確保這是最好的路徑。 –