文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

c++虚函数与虚函数表原理

2024-04-02 19:55

关注

1.什么是虚函数?

virtual 修饰的成员函数叫虚函数

小知识: 没有虚构造函数        不写虚函数,没有默认的虚函数

普通函数不影响类的内存:


class MM
{
public:
    void print() 
 {
  cout << "普通函数"<< endl;    //普通函数不影响类的内存<--->普通函数存在另一段内存中
 }
protected:
};

void testVirtual()
{
 //C语言不允许存在空的结构体
 cout << sizeof(MM) << endl;
}
int main() 
{
 testVirtual();
 return 0;
}




2.虚函数会影响类的内存

增加一个指针的内存,32位操作系统多4个字节 ,64位操作系统多8个字节


#include <iostream>
using namespace std;
class MM
{
public:
 virtual void print1() 
 {
  cout << "虚函数1"<< endl;
 }
 
protected:
};
void testVirtual()
{
 
 cout << sizeof(MM) << endl;  
 
}
int main() 
{
 testVirtual();
 return 0;
}



小知识:一旦有了数据,标识位就不需要存在了


class A
{
 int num;    //输出4而不是5   (4+1)
};
class B
{
    //用1字节标识当前内存为结构体内存
};
void testVirtual()
{

 cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
}
int main()
{
 testVirtual();
 return 0;
}





3.了解虚函数表--->通过虚函数表的指针去访问数据

就是一个指针存储所有虚函数的首地址(虚函数函数名)<--->函数指针

只有指针可以操作一段内存(4字节)


所有的虚函数其实是 用一个函数指针去存储的 ,把 这个函数指针指向的这一段内存 称为虚函数表


#include <iostream>
using namespace std;
class MM
{
public:
 virtual void print1() 
 {
  cout << "虚函数1"<< endl;
 } 
    virtual void print2() 
 {
  cout << "虚函数2"<< endl;
 } 
protected:
};
void testVirtual()
{
//虚函数表  
 MM mm;    //构建一个对象
 int** vptr = (int** )&mm;    //定义一个二级指针&对象的地址  强转类型
 typedef void(*PF)();         //函数指针定义别名
 PF func = (PF)vptr[0][0];    //把地址转为函数指针,访问第一个函数指针的地址

 func();  //通过虚函数表的函数指针调用第一个虚函数
 func = (PF)vptr[0][1];
 func();  //调用第二个虚函数
}
int main() 
{
 testVirtual();
 return 0;
}




4.虚函数声明

虚函数可以在类中声明,在类外实现,不再需要virtual修饰词,只要类名限定就可以了


class MM
{
public:
 virtual void print3();
  
protected:
};
void MM::print3() {
 cout << "虚函数3" << endl;

}
int main()
{
 MM mm;
 mm.print3();
 return 0;
}



到此这篇关于c++虚函数与虚函数表原理的文章就介绍到这了,更多相关c++虚函数与虚函数表内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯