2011-10-13 96 views
1

可能重複:
Private/protected inheritance
What is the cost of inheritance?如何昂貴或昂貴是用C++繼承

我很抱歉,如果這個問題是重複的。 我有一個C++類說A,它有一些方法,其中我只對一種方法感興趣。我需要實現一個新的類B,它具有與A相同的數據成員。我不想B中的A的所有內容,但只有一種方法(或可能是一對)。 B應該嚴格執行新的操作X,但不應該暴露A所做的任何事情。

那麼從A繼承B有意義嗎?在內存佔用和性能方面,這有多昂貴?如果我從A複製到B而不從A繼承B,是否明智?我還有什麼其他的選擇?

+1

請參閱http://stackoverflow.com/questions/374399/private-protected-inheritance – GSerg

回答

0

如果B從A公開繼承,那麼你就是說A B A,也就是說,無論你能用A做什麼,你也應該可以用B做。如果你沒有想要B中的所有A的行爲都可用,那麼公有繼承就不是要走的路。

最有可能的是,你想要一個簡單的包含關係,由此B包含或引用一個A並調用重用的成員函數(它們在C++中不稱爲方法)。

0

也許替代是組成。繼承是解釋關係「是一個」的好辦法。如果我很好理解,你只需要一種方法(更精確地說,該方法的主體)。因此,也許你的問題的解決方案是,B類包含A類的實例,並調用方法B之後internaly ::富(),然後

void B::Foo() 
{ 
    _a.Foo(); 
} 

繼承是不是在這種情況下很好的解決方案。

1

面向對象設計中常見的誤解是繼承在大多數情況下是正常或好事。當你需要重寫基類的某些操作,但保持相同的接口時,繼承是很好的。

看看其他設計模式,組成等可能更適合你,並仍然可以重用代碼。

class B 
{ 
public: 
    void X() 
    { 
     m_a.Y(); 
    } 
private: 
    A m_a; 
} 
0

要獲得關於如何繼承昂貴是主要問題:在性能有關的,當方法是繼承,只要方法非虛方法調用不貴多。關於內存佔用情況,繼承並不比聚合更昂貴,在這兩種情況下,聚合成員的字段或繼承基類的字段都將在您寫入的新類中定義的字段中隱藏內存。

因此,正如其他人所指出的,您是否使用繼承或聚合/合成的決定不應該基於任何性能/成本度量,而應該基於您是否真的需要is-a關係。