2017-07-14 4 views
1

私はPOD、Trivial、Standard-layoutクラスについて非常にnice articleを読んでいます。継承された標準レイアウトルールに非静的メンバーを持つルールがあるのはなぜですか?

のいずれかが、ほとんどの派生クラスで非静的データメンバを持つ多くても1つのベースクラスで何の非静的データメンバを持っていない、またはまったく基底クラスを持っていません。しかし、私は、標準的なレイアウトクラスルールの質問があります非静的データメンバ

と私は、ソースコードを書いた:

#include <iostream> 

struct A { 
    int a; 
}; 

struct B { 
    int b; 
}; 

struct C : A, B { 
    int c; 
}; 

int main() { 
    C c = {}; // initialize C 
    c.a = 0xffffffff; 
    c.b = 0xeeeeeeee; 
    c.c = 0xdddddddd; 
    std::cout << std::hex << *(reinterpret_cast<int*>(&c) ) << std::endl; 
    std::cout << std::hex << *(reinterpret_cast<int*>(&c)+1) << std::endl; 
    std::cout << std::hex << *(reinterpret_cast<int*>(&c)+2) << std::endl; 
} 

結果は次のとおりです。

ffffffff 
eeeeeeee 
dddddddd 

非常にうまくいくと思います。 VS2015でデバッガを使用すると、正常に見えます。

enter image description here

次に、なぜ継承された標準のレイアウトルールで非静的メンバを持つための制限はありますか?

+4

_「うまくいくと思う」_それはどういう意味ですか? –

+2

特定のコンパイラで "うまくいく"ように見え、ある特定のマシンで動作しているような単一の例で、標準を反証しようとしています。それは動作しません。とにかく、標準的なレイアウトクラスが何であるかを定義するだけで、何の制限も言及していないので、質問を理解できません。 – user463035818

+0

実際これはかなり空白な質問です。それは、誰かが「車」が3輪または4輪を持っていることで定義され、自転車で作業できることを観察したと不平を言うようなものです。ただ意味をなさない。 –

答えて

8

読み続ける:

標準レイアウトクラスは、他のプログラミング言語で書かれたコードと通信するために有用です。

あなたが挙げた規則は、オブジェクトの継承階層の1つのクラスだけがデータで構成されていることを要求します。したがって、そのような型は、継承を非常に異なって実装するかもしれない他のプログラミング言語で書かれたコードと通信するために "使いやすい"ものです(Cのようには全くありません。)。

このルールは、より複雑な型を持つことができないこと、またはそれらの型をさまざまなエキゾチックで興味深い方法で使用できないことを意味しません。それは単に「標準レイアウト」タイプと呼ばれることはなく、結果としてそのタイプのカテゴリに属さないことになります。

関連する問題