博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚函数原理1
阅读量:4154 次
发布时间:2019-05-25

本文共 891 字,大约阅读时间需要 2 分钟。

部分参考:

虚函数表的建立是取决于定义类的时候是否包含虚函数,如果有类函数/ 方法声明为虚,则改类会建立一张虚表.在网上找到一个牛人用汇编的方法论证虚 表是存放在常量区内(具体论证就省略,否则就扯远了). 继承类会同样建立一张虚表,并将覆盖虚表中父类虚函数的地址.
在编译阶段,编译器为每个包含虚函数的类创建一个虚表,这个类的所有对象中的虚表指针,都指向这同一份虚表;一般虚表指针放在对象的开始位置;
虚函数表是在代码编译生成,程序载入内存的时候,放在内存常量区. 虚函数指针是在对象建立时由构造函数生成并保存于对象地 址首部.虚函数指针:虚函数指针是在实例化对象 的时候由构造函数生成的指向虚表的指针.放在对象地址的首位. 下面代码用于显 示虚表及虚表指针.

class base{public:		int a;	virtual void Print()	{		cout<<"in base print\n";	}};class d1:public base{public:	void Print()	{		cout<<"in d1 print\n";	}	void d1Print()	{		cout<<"d1 self print \n";	}};class d2:public d1{public:	void Print()	{		cout<<"in d2 print\n";	}	void d2Print()	{		cout<<"d2 self print \n";	}};typedef void (*pfun)();int main(){		base *md2 = new d2;	md2->Print();	d1 *md1 = new d2;	md1->Print();	//上面两个例子说明,虚函数具有向下传递的特性;只要在最开始的基类中定义虚函数,则其他所有的子孙类都默认是虚函数	int *p2 =(int *) md2;//md2本来是指向对象的一个指针,将此指针转换为指向一个int数组的指针,这样就能像访问数组一样访问对象里面的数据	cout<<*p2<

转载地址:http://jieti.baihongyu.com/

你可能感兴趣的文章
Ubuntu Linux系统下apt-get命令详解
查看>>
ubuntu 16.04 下重置 MySQL 5.7 的密码(忘记密码)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
HTTPS那些事 用java实现HTTPS工作原理
查看>>
oracle函数trunc的使用
查看>>
MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
查看>>
java反编译
查看>>
Class.forName( )你搞懂了吗?——转
查看>>
jarFile
查看>>
EJB与JAVA BEAN_J2EE的异步消息机制
查看>>
数学等于号是=那三个横杠是什么符
查看>>
HTTP协议详解
查看>>
java多线程中的join方法详解
查看>>
ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源
查看>>
java abstract修饰符
查看>>
数组分为两部分,使得其和相差最小
查看>>
有趣的排序——百度2017春招
查看>>
二叉树的最近公共祖先LCA
查看>>
数组中累加和为定值K的最长子数组长度
查看>>
素数对--腾讯2017校招编程
查看>>