zoukankan      html  css  js  c++  java
  • C++中不同的继承方式

    【转自e良师益友网】众所周知C语言的强大之处,而C++编程语言功能同样强大,可以对多种程序设计风格提高支持,推荐学习C++编程-基础知识篇。其中就包括面向对象的各种特性。

    我们在这里先为大家讲解一下C++继承的一些基本概念:C++继承方式分为两种,普通继承虚拟继承(virtual)。具体的继承又根据父类中的函数是否virtual而不同。

    下面就单继承分为几种情况阐述:

    方式1、普通继承+父类无virtual函数

    若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(没有vptr)。

    若子类有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(没有vptr),子类的元素(包含vptr,指向vtable.)

    方式2、 普通继承+父类有virtual函数

    不管子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 为父类的元素(包含vptr), 子类的元素。

    如果子类有新定义的virtual函数,那么在父类的vptr(也就是第一个vptr)对应的vtable中添加一个函数指针。

    方式3、virtual继承

    若子类没有新定义virtual函数 此时子类的布局是 : 由低地址->高地址 子类的元素(有vptr),虚基类的元素。为什么这里会出现vptr,因为虚基类派生出来的类中,虚类的对象不在固定位置(猜测应该是在内存的尾部),需 要一个中介才能访问虚类的对象。所以虽然没有virtual函数,子类也需要有一个vptr,对应的vtable中需要有一项指向 虚基类。

    若子类有新定义virtual函数 此时子类的布局是与没有定义新virtual函数内存布局一致。但是在vtable中会多出新增的虚函数的指针。

    方式4、多重继承

    此时子类的布局是 : 由低地址->高地址 为父类p1的元素(p1按照实际情况确定元素中是否包含vptr), 父类p2的元素(p2按照实际情况确定元素中是否包含vptr),子类的元素。

    如果所有父类都没有vptr,那么如果子类定义了新的virtual function,那么子类的元素中会有vptr,对应的vtable会有相应的函数指针。

    如果有的父类存在vptr,我感觉如果子类定义的新的virtual function,会加在第一个有vptr的父类的vtable中。因为子类分配的空间显示并没有新增加一个4字节的指针空间。

    更多关于编程语言教程知识可登陆e良师益友网。

  • 相关阅读:
    C# get folder's Md5 generated by file's and filename's md5. get dictionary md5
    C# DataTable to List<T> based on reflection.
    C# MySql Transaction Async
    C# read file to bytes,File.ReadAllFiles,File.Open(),BinaryReader
    C# get md5,renamed file and can not change file's md5
    C# copy source directory files with original folder to the destination path
    C# transfer local file to remote server based on File.Copy
    C# copy folder and files from source path to target path
    vue slot
    vue 全局配置键盘事件
  • 原文地址:https://www.cnblogs.com/yuguotianqing/p/3982037.html
Copyright © 2011-2022 走看看