C++类的继承关系——多继承(未重写虚函数)
来源:互联网 发布:金庸影响力知乎 编辑:程序博客网 时间:2024/05/08 10:21
首先,在介绍有虚函数的多继承(未重写虚函数),先介绍一下以下概念。
多态:多种形态,简单地说父类的指针或引用调用重写的虚函数,当父类的指针或引用指向父类对象调用的就是父类的虚函数,指向子类对象时调用的就是是子类的虚函数
虚函数:C++中虚函数的主要作用就是实现多态, 在一个类的成员函数前面加上virtual关键字,该函数就被定义成虚函数,虚函数的地址存放在虚表(存放虚函数地址的表,虚表的地址存放在所定义对象中)
那么,当一个子类有多个父类,子类的虚表会放在什么位置?
请看下例:
class Base{public:virtual void FunTest1(){cout << "Base::FunTest1()" << endl;}virtual void FunTest2(){cout << "Base::FunTest2()" << endl;}int _data1;};class Base1{public:virtual void FunTest3(){cout << "Base1::FunTest3()" << endl;}virtual void FunTest4(){cout << "Base1::FunTest4()" << endl;}int _data2;};class Derive :public Base, public Base1{public:virtual void FunTest5(){cout << "Derive::FunTest5()" << endl;}int _data3;};typedef void(*VtbFun)();void PrintVtable(){Derive d1;d1._data1 = 0x01;d1._data2 = 0x02;int* pVTable = (int *)*(int*)&d1;VtbFun FunTest = (VtbFun)*pVTable;while (NULL != FunTest){FunTest();cout << (int*)FunTest << endl;pVTable += 1;FunTest = (VtbFun)*pVTable;}}int main(){Derive d;d._data1 = 0x01;d._data2 = 0x02;d._data3 = 0x03;PrintVtable();return 0;}
0 0
- C++类的继承关系——多继承(未重写虚函数)
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- 继承——构造函数的继承关系
- Java 继承 函数 重写后的调用关系
- 多继承中重写不同基类中的虚函数
- C++多重继承通过中间类继承重写不同基类中相同类型的虚函数
- python 继承 及调用被重写的父类方法(未被绑定的方法)
- 继承关系类的加载顺序、重写与重载
- 继承关系的初始化方法重写
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 类继承时的虚函数调用关系
- 继承(子类与父类构造函数的关系)
- 构造函数的继承关系
- C++里的继承和多态(下)——单继承、多继承、菱形继承(含虚拟函数的继承)
- 类的继承和重写
- Objective-C 类继承关系
- CentOS7安装Docker,运行Nginx镜像、Centos镜像
- C语言笔试题
- leetcode_middle_49_173. Binary Search Tree Iterator
- Ubuntu下查看CPU、内存和硬盘详细信息的几个命令
- 数据结构实验之二叉树的建立与遍历
- C++类的继承关系——多继承(未重写虚函数)
- iOS设置父视图透明度而不影响子视图
- Linux 进程通信IPC对象之信号量
- 常用linux命令
- Hadoop报错---WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
- 详解安卓从图表icon点击到APP启动界面加载流程
- Linux快捷键
- 一步一步制作yaffs/yaffs2根文件系统(二)---安装BusyBox,构造/bin、/sbin、/usr、linuxr
- SQLite对MySQL对PostgreSQL:关系数据库管理系统比拼