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

 更新时间:2022年01月24日 16:57:26   作者:考拉爱睡觉鸭~  
这篇文章主要介绍了c++虚函数与虚函数表原理,用virtual 修饰的成员函数叫虚函数,下面围绕c++虚函数与虚函数得相关资料展开内容,需要的朋友可以参考一下

1.什么是虚函数?

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

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

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

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

void testVirtual()
{
 //C语言不允许存在空的结构体
 cout << sizeof(MM) << endl;/*(没有数据成员的)空的类或者结构体 占用1字节  用1字节标识当 
                                   前内存为结构体内存*/
}
int main() 
{
 testVirtual();
 return 0;
}
/*输出*/

/* 1 */

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

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

#include <iostream>
using namespace std;
class MM
{
public:
 virtual void print1() 
 {
  cout << "虚函数1"<< endl;
 }
 /*virtual void print2()
 {
  cout << "虚函数2" << endl;
 }     无论多少个虚函数,增加的字节就是一个指针的字节--->多了一个虚函数,还是4个字节*/
protected:
};
void testVirtual()
{
 
 cout << sizeof(MM) << endl;  
 
}
int main() 
{
 testVirtual();
 return 0;
}
/*输出*/

/*  4  */

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

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;
}

/*输出*/

/*4
  1*/

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;
}
/*输出*/

/*虚函数1
  虚函数2*/

4.虚函数声明

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

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

}
int main()
{
 MM mm;
 mm.print3();
 return 0;
}
/*输出*/

/*虚函数3*/

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

相关文章

  • VC实现的病毒专杀工具完整实例

    VC实现的病毒专杀工具完整实例

    这篇文章主要介绍了VC实现的病毒专杀工具完整实例,详细讲述了针对病毒的进程终止、删除文件及回复注册表与启动项等,同时介绍了与之相关的系统函数,非常具有参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C语言中嵌入Lua解释器的方法详解

    C语言中嵌入Lua解释器的方法详解

    Lua语言是一个轻量的脚本语言,可以用很少的资源运行其解释器,这篇文章主要为大家介绍了如何在C语言中嵌入Lua解释器的方法,希望对大家有所帮助
    2024-05-05
  • C语言关于二叉树中堆的创建和使用整理

    C语言关于二叉树中堆的创建和使用整理

    大家好,这里是针对二叉树中堆结构的顺序储存,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
    2022-08-08
  • C语言程序的编译与预处理详解

    C语言程序的编译与预处理详解

    这篇文章主要介绍了C语言程序的编译与预处理,包括介绍了C和C++混合编程的情况,需要的朋友可以参考下,希望能够给你带来帮助
    2021-10-10
  • C++ Boost Chrono实现计时码表流程详解

    C++ Boost Chrono实现计时码表流程详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • 纯C语言实现火车售票系统

    纯C语言实现火车售票系统

    这篇文章主要为大家详细介绍了纯C语言实现火车售票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • dev c++的使用和调试方式

    dev c++的使用和调试方式

    这篇文章主要介绍了dev c++ 的使用和调试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 使用C语言实现交换整数的奇数位和偶数位

    使用C语言实现交换整数的奇数位和偶数位

    在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使用C语言代码实现将一个整数的奇数位和偶数位交换,需要的朋友可以参考下
    2025-03-03
  • C++实现简单贪吃蛇小游戏

    C++实现简单贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C++实现简单贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言实现歌曲信息管理系统

    C语言实现歌曲信息管理系统

    这篇文章主要为大家详细介绍了C语言实现歌曲信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论