c++学习笔记之继承

继承的本质即是数据的复制
为什么这么说呢?看下面的代码

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个变量

由此可知在子类创建一个对象的时候,父类已经将所有的成员变量的所占的数据空间给复制到子类中

c++学习笔记之继承_第1张图片

当父类把所有的成员变量都复制到子类中时 那么子类的成员变量数量为4

子类的结构体大小应该占16个字节

我们在来看看这段代码

c++学习笔记之继承_第2张图片

由此可知类的首地址就是第一个成员变量的地址


父类与子类

为什么可以将父类指向子类而不用强制转换呢??

我们从上面可知子类创建的时候将父类所有的成员变量都copy了过来

c++学习笔记之继承_第3张图片

因为我们知道父类的数据就在子类里面

所以不需要强制转换

但是父类只能访问它自己那一部分的成员变量(毕竟父类的数据宽度和子类的数据宽度是不一样的)

如果需要访问子类的成员变量 那就需要用其他的方式了

如果是子类指向父类呢?

那就需要强制转换了,不过建议大家尽量不要这么做,为什么呢?

看上面那个图,虽然编译成功 但是父类的数据宽度 比子类的数据宽度可能要小

c++学习笔记之继承_第4张图片

若是有错误之处 还请指明!多谢

你可能感兴趣的:(c++学习笔记之继承)