我正在使用vs2013(Win32)测试以下程序:
#include <iostream>
class A {
virtual void funA();
};
class B {
virtual void funB();
};
class C :public A{
int i;
virtual void funC();
};
class D :public B, C{
virtual void funD();
};
int main(){
std::cout << "size A " << sizeof(A) << std::endl;
std::cout << "size B " << sizeof(B) << std::endl;
std::cout << "size C " << sizeof(C) << std::endl;
std::cout << "size D " << sizeof(D) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是
尺寸A 4
尺寸B 4
尺寸C 8
尺寸D 12
为什么sizeof(C)!= 8 + sizeof(A),sizeof(D)!= 4 + sizeof(B)+ sizeof(C)?
A
是一个带有虚方法的单一基类,因此是一个vtable指针,因此在像你这样的32位平台上有4个字节.
B
就像A
.
C
就像A
加一个4字节整数一样.请注意,它仍然只有一个基类(A
),这意味着仍然只有一个vtable指针.
D
使用彼此无关的虚方法从两个基类继承,因此D
获得两个vtable
指针(每个基类一个),加上来自的4字节整数C
.因此总共12个字节.
归档时间: |
|
查看次数: |
54 次 |
最近记录: |