2012-03-07 63 views
0

這是我的疑問: 我有兩個類A和B. 我可以這樣寫:什麼是最好的繼承或使用公共對象?

class A: public B {....} 

所以an_instance_of_A可以使用B分析方法。

但我也寫:

class A { 
public: 
B instance_B; 
} 

所以an_instance_of_A可以使用instance_B的方法。 (即B方法)。

我可以這樣做。 什麼是最好的?什麼是快速編譯?它是一樣的嗎? 謝謝。

+0

這取決於。什麼是'A'和'B'? 'A'是'B'嗎?爲什麼需要公開?編譯速度不如正確設計(除非是在最極端的情況下),並且良好的設計很少會導致編譯時間過長。 – 2012-03-07 07:13:56

+1

問題不在於使用方法,而是爲您的問題選擇最佳設計。圍繞這個主題寫了一堆書。您可以從維基百科開始:http://en.wikipedia.org/wiki/Composition_over_inheritance,http://en.wikipedia.org/wiki/Circle-ellipse_problem並從此繼續。 – dbrank0 2012-03-07 07:20:48

+0

[Prefer composition over inheritance?](http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance) – 2012-03-07 07:41:34

回答

0

公共繼承描述了一個is-a的關係。也就是說,任何你可以用B做的事情,你也可以做A.

公共對象是完全不同的東西,並不常見。如果A可能有多個B,那麼你不能使用繼承,所以使用組合(成員對象)。如果他們應該公開或不依賴於A和B以及你想如何使用它們。

編輯,似乎這個問題是一場勢均力敵的比賽重複:

Prefer composition over inheritance?

正如詹姆斯說,編譯時間除特殊情況下繼承或組合之間進行選擇時不應該是一個高優先級。

2

繼承當存在「是-A」關係時。例如在vehiclecar之間。

當存在「包含」或「包含」類型的realtion時,您使用數據成員。像class schoolclass teacher,class student,class student等組成

0

如前所述,只有當A也是B(例如工人也是人)時才應該使用公共繼承。

在類內部有一個對象實例,只要它不是公共的,就更適合測試和封裝。除POD外,請勿公開會員。這會產生一些問題(例如,有人可能很容易破壞班級的完整性)