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

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


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

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

我们在来看看这段代码


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


父类与子类

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

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

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

所以不需要强制转换

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

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

如果是子类指向父类呢?

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

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容