2015-02-06 21 views
0

考慮以下代碼:基類中的數據成員是否存在於派生類中會導致內存浪費?

class A 
{ 
private: 
    int a,b;  
public: 
    void getA(){ cout << a << b; } 
    void setA(int n1,int n2){ a = n1; b = n2; } 
}; 

class B : public A 
{ 
private: 
    int c; 
}; 

int main(){ 
    B b1; 
    b1.setA(); 
    b1.getA(); 
    return 0; 
} 

聲明B b1;創建對象,intab(這是在A類中聲明)耗內存。如果我只想使用b,則與a相關的內存將被浪費。這不會導致內存浪費;特別是在大型節目中?

+1

如果'b'無法訪問'A :: a',那麼'b1.setA();'會做什麼? – juanchopanza 2015-02-06 08:09:35

+1

是且不是,因爲這意味着班級層次設計得不好。 – 2015-02-06 08:10:18

+0

不,我想使用其中的一些,但不是所有的都在我的派生類中,我的觀點是不是會導致內存浪費? – 2015-02-06 08:18:59

回答

2

公有繼承模型的是-A的關係,因此,如果B是一個必須有A有可能包括的東西(數據類型,函數等)不屬於被B直接訪問一切

8

如果你說B只需要訪問b而不是a,那就意味着設計是錯誤的,你不應該首先使用繼承。

繼承是一種「是一種」關係。任何B是一個A,然後一些。如果B僅使用某些A對象的某些成員,請考慮將該成員作爲參數傳遞或將BA(使用B中的A指針)解耦。 請勿使用繼承,以方便訪問成員。

因此,答案是肯定的,它是一種浪費內存,但僅僅是因爲它的設計不當。

+0

非常感謝 – 2015-02-06 08:23:12

+0

另一種選擇是將公共部分重構爲A'和B'將從中派生出來的類。 – Angew 2015-02-06 08:56:38

+1

@只有在設計明智的情況下才有意義。不要設計類並只能繼承,以便可以使用通用部分 - 根據邏輯上是否有意義來做出決定。 – 2015-02-06 08:58:53

0

好吧,如果你不需要你的基類的所有成員在派生類中,那麼,就會有浪費內存。

我們應該編碼,以減少像這樣的內存浪費。

相關問題