仮想のオブジェクトサイズについていくつか質問があります。
1)仮想機能
class A {
public:
int a;
virtual void v();
}
クラスAのサイズは8バイトです....1つの整数(4バイト)と1つの仮想ポインタ(4バイト)それは明らかです!
class B: public A{
public:
int b;
virtual void w();
}
クラスBのサイズはどれくらいですか?sizeof Bを使用してテストしましたが、12を出力します
クラスBとクラスAの両方に仮想機能がある場合でも、vptrが1つしかないということですか?vptrが1つしかないのはなぜですか?
class A {
public:
int a;
virtual void v();
};
class B {
public:
int b;
virtual void w();
};
class C : public A, public B {
public:
int c;
virtual void x();
};
Cのサイズは20.......です。
この場合、2つのvptrがレイアウトに含まれているようです.....これはどのように発生しますか?2つのvptrは1つはクラスA用で、もう1つはクラスB用だと思います。クラスCの仮想関数用のvptrはありませんか?
私の質問は、継承のvptrの数についてのルールは何ですか?
2)仮想継承
class A {
public:
int a;
virtual void v();
};
class B: virtual public A{ //virtual inheritance
public:
int b;
virtual void w();
};
class C : public A { //non-virtual inheritance
public:
int c;
virtual void x();
};
class D: public B, public C {
public:
int d;
virtual void y();
};
Aのサイズは8バイトです--------------4(int a)+ 4(vptr)= 8
Bのサイズは16バイトです--------------仮想がない場合は4+4 + 4 = 12である必要があります。なぜここにさらに4バイトがあるのですか?クラスBのレイアウトは何ですか?
Cのサイズは12バイトです。-------------- 4 + 4 + 4 = 12.明らかです!
Dのサイズは32バイトです--------------16(クラスB)+ 12(クラスC)+ 4(int d)= 32である必要があります。そうですか?
class A {
public:
int a;
virtual void v();
};
class B: virtual public A{ //virtual inheritance here
public:
int b;
virtual void w();
};
class C : virtual public A { //virtual inheritance here
public:
int c;
virtual void x();
};
class D: public B, public C {
public:
int d;
virtual void y();
};
Aのサイズは8です
Bのサイズは16です
Cのsizeofは16です
sizeofDは28です28= 16(クラスB)+ 16(クラスC)-8(クラスA)+ 4(これは何ですか?)
私の質問は、仮想継承が適用されるときになぜ余分なスペースがあるのですか?
この場合のオブジェクトサイズの基本的なルールは何ですか?
仮想がすべての基本クラスと一部の基本クラスに適用される場合の違いは何ですか?