簡體   English   中英

C ++消歧:子對象和子類對象

[英]C++ Disambiguation: subobject and subclass object

基本上標題是什么。 我一直將Base對象稱為子對象。 這是正確的, subobject == superclass object也是正確的嗎? 哪一個更受歡迎?

subclass意味着派生類, subclass object意味着派生類'對象,對嗎?

對我來說困惑的是subclass object != subobject

如果這是正確的,無論如何..

謝謝

C ++標准明確定義了子對象是什么。 也就是說,許多人在談論C ++時並沒有(精確地)使用標准語言。 一個流行的例子是術語對象 從像Java這樣的語言中,有些人傾向於僅在實例意義上使用對象 ,這不適用於int 在C ++標准中, int是一個對象。

標准在[intro.object] / 2中所說的內容:

對象可以包含其他對象,稱為子對象 子對象可以是成員子對象基類子對象或數組元素。 不是任何其他對象的子對象的對象稱為完整對象

這應該在(可能的)存儲器布局的上下文中理解。 它沒有完全指定,但很可能看起來像這樣:

class Foo { int i; };
class Bar : public Foo { int j; };

Bar類型的對象在內存中看起來像這樣:

+-Bar-------------------+
|  +-Foo-----+          |
|  |  int i  |  int j;  |
|  +---------+          |
+-----------------------+

也就是說,成員Foo的成員Bar一樣的直接成員Bar 因此, Bar每個對象都“包含”一個Foo類型的對象。 還考慮一下

Bar b;
Bar* pBar = &b;
Foo* pFoo = &b;
+-Bar-------------------+
|  +-Foo-----+          |
|  |  int i  |  int j;  |
|  +---------+          |
+--^--------------------+
^  |pFoo
|pBar

以允許pFoo指向完成類型的對象Foo和類型的子對象Foo ,需要有一個整體,(存儲器明智)類型的獨立的對象Foo類型的任何對象內部Bar 在編譯時可能不知道哪一個是這種情況,但為pFoo->i = 5;生成的代碼pFoo->i = 5; 必須為兩者工作。

這一切都在as-if規則下指定,即它不一定是這樣,但它必須以這種方式表現出來。 此外,不要求這是實際的內存布局,但它是一種常見的實現方式。


在[intro.object] / 4中

如果完整對象,數據成員或數組元素屬於類類型,則其類型被視為派生程度最高的類 ,以區別於任何基類子對象的類類型; 最派生類類型或非類類型的對象稱為最派生對象

除了取代超集之外,標准中沒有使用super這個詞。 基類派生類 (以及〜對象)。


在C ++語言標准之外,術語超類用於引用基類 ,術語子類用於引用派生類 這指的是OO概念和分類,很像物種是生物學中的一個的子類別。

但在這種分類中,沒有內存布局,因此無需談論子對象 實例 對象 (在OO意義上的),所以你可以談論一個子類 父類的對象目標 混淆可能源於將子類子對象縮寫為子對象 ,以及將OO的語言與C ++標准的語言混合。

當一般面向對象術語與C ++相關術語混合時會發生這種情況。

  • subobject:存儲在另一個對象(數組元素,基類對象和數據成員對象)中的任何對象。
  • sub-class:一個通用的面向對象術語,指的是C ++中的所謂“派生類”
  • 超類:一般的面向對象術語,指的是C ++中的“基類”。
  • 完整對象:未存儲在另一個對象中的任何對象。

只是一點提示 - 在C ++領域談話時,我嘗試使用C ++術語。 在Java談話時,我正在嘗試與Java術語交談。

Subobject是一個對象的C ++術語,它是另一個對象的一部分; 成員或基類。

子類是其他語言中使用的術語,以及對繼承的更一般性討論,表示派生類。 這來自將類層次結構繪制為倒置樹的常規,其根位於頂部。 C ++不使用這個術語,可能是因為你描述的潛在混淆。

為了避免在討論C ++中的繼承時出現混淆,請使用類和派生類的標准術語。

我認為大多數情況下,子對象容易混淆地引用子類對象的基類相關部分(例如一些vtable指針),特別是在涉及多重繼承時的設置中。 我建議避免使用該術語並堅持使用更為明確的術語(Super / Sub,Base / Derived)。

我會把它稱為父對象嗎?

暫無
暫無

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

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