2013-06-26 98 views
0

我有類A,有更新B屬性的方法。所以,我需要繼承。C++繼承與組合一起使用

class B{ 
public: 
int x; 
}; 

class A : public B{ 
public: 
void update(int y){ 
x = y; 
} 
}; 

我也想通過B類達到功能「更新」,所以我也需要組合。

class B{ 
public: 
A a; 
int x; 
}; 

class A : public B{ 
public: 
void update(int y){ 
x = y; 
} 
}; 

我希望我的結構正因爲如此,所以我想跟蹤對象類型B的性質是這樣的:

... 
B.a.update(5); 
int n = B.x; 

然而,聲明類A之前,我不能用的組合物,且不能使用在聲明類B之前繼承。我該如何解決這個無限循環?

+0

您的示例代碼將無法正常工作,您無法在B.a上調用函數update()並將其分配給int。你必須定義一個轉換運算符來做到這一點。 – bennofs

+0

bennofs;對象「a」是類型「A」,有一個名爲update的方法,所以你可以做到這一點。 – baci

+0

好的,你糾正了它 – bennofs

回答

2

我不知道你想在這裏實現什麼,但如果我猜測正確的話,你可能需要的是一個虛函數:

class B{ 
public: 
int B; 
virtual void update(int x){ 
    B = x; 
} 
}; 

class A : public B{ 
public: 
virtual void update(int x){ 
    // Here goes code specific to B-class. 
    B::update(x); 
    // or here ;) 
} 
}; 

順便說一句,你可能不希望int B字段在public:部分;如果您從update方法修改它的值,那麼您可能不希望其他人嘗試直接修改它。

+0

好的,我想更新B的屬性THROUGH A,但是我也想通過B來達到這些方法;多數民衆贊成我最終想要達到的。 – baci

+1

@C.CanberkBacı:'虛擬'功能是你如何做到這一點。 –

+0

正方形是一個矩形 - > is-a - >使用繼承 汽車有一個窗口 - >有一個 - >使用組合 這是「C++思維」書提供給我的,所以我很困惑我的情況,彷彿這是不可能的。謝謝 – baci