簡體   English   中英

繼承與構成::我的理解正確嗎?

[英]Inheritance vs Composition:: Is my understanding correct?

在組合中,一個類明確包含另一個。 但是,在繼承中,基類隱式包含在派生類中。 正確與否? 我之所以這樣問,是因為在研究了幾天的繼承之后,直到今天我才讀到某個地方,派生類的對象始終包含其基類的對象。

我的意思是,我以為只有一個對象,而功能只會被繼承,但我不知道它也將包含基類的對象。

在組合中,一個對象包含另一個對象。 在繼承時,您的對象是獲取基類的屬性。

我的意思是,我以為只有一個對象,而功能只會被繼承,但我不知道它也將包含基類的對象。

是的,您是對的,將只有一個對象並且功能將被繼承。 即使您的基類具有成員變量,大小也會被添加到對象大小中。

您可以直接調用基類的公共方法和受保護的方法。 在建立幣種關系時,您只能訪問公共方法。

那應該是:在組合中,一個類顯式包含另一個類的對象 但是,在繼承中,基類隱式包含在派生類中。

簡而言之:組成是關於類與對象之間的關系。 繼承是關於類與類的關系的。

並且請記住“優先考慮組成而不是繼承”。 比繼承更偏愛組成?

考慮一下代碼:

class Engine
{
//Some Code
};

class Vehicle
{
//Some Code
};

class Car:Vehicle
{
    Engine engine;
    //Some Code
};

在這種情況下,Car類繼承了Vehicle類。 Car類的對象不包含Vehicle對象,而是Vehicle(Inheritance)類的對象。 另一方面,它確實包含Engine(Composition)類的對象。

你可以訪問父的功能其實this來自於一個事實,即Car對象是車輛,不是因為它包含Vehicle對象。

通常,派生類包含所有數據成員並共享基類的屬性/方法,但是在組成和繼承之間有所區別。

“組成”是指一個對象“具有”其他對象。 例如:人有肝臟。 在課堂設計中,可以如下所示:

class Liver {};

class Human
{
public:
  Human() {}
private:
  Liver mLiver;
}

在討論繼承時,有兩種選擇:公共繼承粗略地說一個對象“是”另一種對象。 例如:人類是一種生物。 聽起來人類在里面“有”活着的生物是不自然的。 在這種情況下,公共繼承是一種解決方法:

class LivingCreature {};

class Human : public LivingCreature
{
public:
  Human() {}
}

另一個選項是受保護/私有繼承,應用於“根據”另一個對象來實現某些對象。 通常,它也可以視為一種組合物,但是第一種方法通常更好。

總結:

  • 如果您可以說一個對象“是”另一種更通用的對象:公共繼承是最好的選擇,
  • 如果可以說一個對象“擁有”另一個對象:請使用合成。

在組合中,一個類明確包含另一個。 但是,在繼承中,基類隱式包含在派生類中。 正確與否?

這完全是一個知識/觀點的問題:如果您知道繼承意味着基類實例將被嵌入派生類中,則說class Dervived : Base可以被視為顯式請求,而如果您知道定義class X一個變量意味着它是一個成員變量,將包含在X實例中,然后也可以看作是顯式的。

我之所以這么問,是因為在研究了幾天的繼承之后,直到今天我才讀到某個地方,派生類的對象始終包含其[sic]基類的對象。

在開始學習繼承時,實際上包含基類對象與通過某些未指定/神秘的方法有時可以代替基類實例之間的區別不一定是最重要的事情,因此很容易想到在所有學習資料中都沒有強調。

我的意思是,我以為只有一個對象,而功能只會被繼承,但我不知道它也將包含基類的對象。

在實現級別,重要的是它實際上包含一個基類實例,因此為處理基類對象而編譯的代碼可以在派生類實例上同樣有效地工作。 C ++標准本可以認為它只是具有相同二進制布局的基類內容的嵌入式副本,而不是實際的基類對象,但是在該標准中必須添加大量文本以提及派生對象可能是在可以接受基類實例的情況下使用。 換句話說,這種區別在某種程度上是任意的,但如果既直觀又自然地適合於更簡單,更簡潔的標准措辭,則對每個人來說都比較容易。

繼承與構成::我的理解正確嗎?

概念差異:

遺產:

在繼承的情況下,派生類基類的子類型。 如果你獲得含義DogAnimal ,那么Dog Animal ,並且可以在執行所有操作* Animal可以進行Dog

  • 但是,使用privateprotectedpublic繼承關系,您可以控制誰知道 DogAnimal以及誰知道Animal內部工作原理。 protectedprivate繼承的情況下,只有Dog會知道它是Animal ,但是從外面看不出來。

組成:

在作文的情況下,一類包括在另一類中。 Car不是Wheel 但是它包含Wheel 因此,在Wheel上執行的操作將無法在Car

通過將Wheel類型的成員變量聲明為publicprivateprotected ,可以控制誰可以訪問CarWheel

我相信這足夠清楚嗎?

實施細節:

對於C ++,基類的成員包含在派生類中。 基類中存在的方法也可以在派生類中訪問-某個地方。 訪問說明符privatepublicprotected AND繼承類型確定哪些方法可見以及在何處。

我以為只有一個物體

這是一個對象。

在Microsoft編譯器和g ++對象被“合並”在一起,這意味着在以下情況下:

struct Base{
    int a;
};

strict Derived: public Base{
    int b;
};

內部Derived 可能會 (需要檢查C ++標准以確保)具有此布局。

strict Derived{
    int a;
    int c;
};

要么

struct Derived{
    Base _;
    int c;
};

在多重繼承和鑽石繼承的情況下,事情將變得更加復雜,並且可以多次包含基類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM