[英]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 ++相關術語混合時會發生這種情況。
只是一點提示 - 在C ++領域談話時,我嘗試使用C ++術語。 在Java談話時,我正在嘗試與Java術語交談。
Subobject是一個對象的C ++術語,它是另一個對象的一部分; 成員或基類。
子類是其他語言中使用的術語,以及對繼承的更一般性討論,表示派生類。 這來自將類層次結構繪制為倒置樹的常規,其根位於頂部。 C ++不使用這個術語,可能是因為你描述的潛在混淆。
為了避免在討論C ++中的繼承時出現混淆,請使用基類和派生類的標准術語。
我認為大多數情況下,子對象容易混淆地引用子類對象的基類相關部分(例如一些vtable指針),特別是在涉及多重繼承時的設置中。 我建議避免使用該術語並堅持使用更為明確的術語(Super / Sub,Base / Derived)。
我會把它稱為父對象嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.