继承的本质即是数据的复制
为什么这么说呢?看下面的代码
struct Count
{
int x;
int y;
int k;
};
struct Count1 :Count
{
int v;
};
struct Count2 :Count
{
int v;
};
void test()
{
Count1 c1;//创建一个子类
c1.x = 1;
c1.y = 2;
c1.k = 3;
c1.v = 4;
//这是它的反汇编代码
00B023A8 mov dword ptr [ebp-18h],1
00B023AF mov dword ptr [ebp-14h],2
00B023B6 mov dword ptr [ebp-10h],3
00B023BD mov dword ptr [ebp-0Ch],4
}
void test1()
{
Count2 c2;
c2.x = 1;
c2.y = 2;
c2.k = 3;
c2.v = 4;
//这是它的反汇编代码
00B023A8 mov dword ptr [ebp-18h],1
00B023AF mov dword ptr [ebp-14h],2
00B023B6 mov dword ptr [ebp-10h],3
00B023BD mov dword ptr [ebp-0Ch],4
}
int _tmain()
{
test();
test1();
return 0;
}
由此可知它的反汇编代码都是一样的
我们知道子类中只创建了一个成员变量吧
而反汇编这里却多了ebp-18h、ebp-14h、ebp-10h这3个变量
由此可知在子类创建一个对象的时候,父类已经将所有的成员变量的所占的数据空间给复制到子类中
当父类把所有的成员变量都复制到子类中时 那么子类的成员变量数量为4
子类的结构体大小应该占16个字节
我们在来看看这段代码
由此可知类的首地址就是第一个成员变量的地址
父类与子类
为什么可以将父类指向子类而不用强制转换呢??
我们从上面可知子类创建的时候将父类所有的成员变量都copy了过来
因为我们知道父类的数据就在子类里面
所以不需要强制转换
但是父类只能访问它自己那一部分的成员变量(毕竟父类的数据宽度和子类的数据宽度是不一样的)
如果需要访问子类的成员变量 那就需要用其他的方式了
如果是子类指向父类呢?
那就需要强制转换了,不过建议大家尽量不要这么做,为什么呢?
看上面那个图,虽然编译成功 但是父类的数据宽度 比子类的数据宽度可能要小
若是有错误之处 还请指明!多谢