栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

简述C++中虚拟函数的内存分配机制

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简述C++中虚拟函数的内存分配机制

因为虚拟函数的地址翻译取决于对象的内存地址,而不取决于数据类型(编译器对函数

调用的合法性检查取决于数据类型)。原来,如果类中定义了虚拟函数,该类及其派生类

就要生成一张虚函数表,即vtable。而在类的对象地址空间中存储一个该虚函数表的入口,

占4个字节,这个入口地址是在构造对象是由编译器写入的。

有如下C++程序:

//#include

#include
using namespace std;

class CMem	
{
	
public:
 CMem(){}
public:
 int m_first;
private:
 unsigned char m_second;
 
public :
 void fun1();
 virtual int funOver(){return 1;}
 
};



class CMemSub : public CMem
{

public:
 CMemSub(){}

public:
 int m_three;

private:
 int m_four;
 
public:
 void fun3();
 virtual int funOver(){return 2;}

virtual int fun4(){return 3;}


};


int main()
{ 
 CMem a,*pMem;
 CMemSub b;
  pMem = &a;
 printf("%d/n",pMem->funOver());
 
  pMem = &b;
  printf("%d/n",pMem->funOver());

 
	
	return 0;
}

程序运行结果为:

1

2

这里涉及到虚函数的工作机制,由于对象的内存空间中包含了虚函数表的入口,

编译器能够由这个入口找到适当的虚函数,这个函数的地址不再由数据类型决定了。

语句pMem = &b;使pMem指向对象b的内存空间,调用pMem->funOver()时,

编译器得到了对象b的vtable入口,并由这个入口找到了CMemSub::funOver()虚函数地址。到此,虚函数的秘密终于大白于天下了。虚函数是C++语法的重点和难点。

以上就是简述C++中虚拟函数的内存分配机制的详细内容,更多关于c++虚拟函数的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/61383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号