簡體   English   中英

C struct繼承與C ++ POD struct繼承

[英]C struct Inheritance vs C++ POD struct Inheritance

假設我使用相當普遍的慣用法在my_header.h定義結構繼承:

struct A { int a_field; ... };
struct B { struct A _as_A; int b_field; ... };

現在,在我的C代碼中,我可以執行binstance._as_A.a_field ,或者可以將指向B的指針轉換為指向A的指針,依此類推。

我的問題是這個。 假設我現在定義了一個新的C ++頭文件my_header.hpp

struct A { int a_field; ... }
struct B : A { int b_field; ... }

假設我這樣做是為了確保B是POD類型

我是否可以保證B實例的內存布局在C和C ++中相同?

假設我這樣做是為了確保B是POD類型。

正如評論中指出的那樣, B永遠不會是POD類型,因為它永遠不會是標准布局類。

7 標准布局類是這樣的類:

[...]

(7.5)-在派生程度最高的類中沒有非靜態數據成員,並且在最多一個具有非靜態數據成員的基類中,或者沒有具有非靜態數據成員的基類,並且

[...]

10 POD結構 110是既是瑣碎類又是標准布局類的非聯盟類,並且不具有非POD結構,非POD聯合(或此類數組)類型的非靜態數據成員。 。 類似地, POD聯合是既是普通類又是標准布局類的聯合,並且不具有非POD結構,非POD聯合(或此類數組)類型的非靜態數據成員。 POD類是可以是POD結構或POD聯合的類。

因此,您提出的字面問題根本無關緊要:即使布局順序得到保證,您仍然無法做您想做的事情。 這很重要,因為具體的實現通常確實會按照您希望的方式(作為ABI的一部分)定義布局順序,但這還不足以滿足您的需求。

否。C++標准草案N4296指出:

10個派生類
5未指定在最派生對象(1.8)中分配基類子對象的順序。 [...]
8 [注:基類子對象的布局(3.7)與相同類型的大多數派生對象的布局不同。 [...]

暫無
暫無

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

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