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

作者:考拉爱睡觉鸭~ 时间:2023-12-09 07:22:45 

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字节)

/*无论多少个虚函数,增加的字节就是一个指针的字节*/
所有的虚函数其实是 用一个函数指针去存储的 ,把 这个函数指针指向的这一段内存 称为虚函数表

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


#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*/

来源:https://blog.csdn.net/weixin_60569662/article/details/121722479

标签:c++,虚函数,虚函数表
0
投稿

猜你喜欢

  • Spring及Mybatis整合占位符解析失败问题解决

    2022-08-13 06:42:49
  • Spring boot创建自定义starter的完整步骤

    2023-05-08 08:08:53
  • 解析Tars-Java客户端源码

    2023-04-08 01:18:39
  • IntelliJ IDEA 创建spring boot 的Hello World 项目(图解)

    2023-03-10 16:13:45
  • JavaWeb使用Cookie模拟实现自动登录功能(不需用户名和密码)

    2021-09-06 00:15:03
  • Bootstrap 下拉菜单.dropdown的具体使用方法

    2023-07-08 19:10:46
  • Java如何使用Query动态拼接SQL详解

    2022-12-31 09:40:14
  • Android常见控件使用详解

    2023-03-11 13:15:23
  • Java实现发红包功能

    2023-12-09 10:33:03
  • SpringBoot 自定义starter yaml提示失效问题及解决方法

    2022-08-03 14:58:42
  • Android编程中EditText限制文字输入的方法

    2023-07-19 07:30:48
  • Flutter瀑布流仿写原生的复用机制详解

    2023-06-20 17:02:08
  • 基于Android中的 AutoCompleteTextView实现自动填充

    2023-04-02 07:11:36
  • Android第三方开源下拉框NiceSpinner使用详解

    2023-01-04 11:10:29
  • Spring内存缓存Caffeine的基本使用教程分享

    2023-05-26 00:30:33
  • 简单了解redis常见客户端及Sharding机制原理

    2022-03-28 16:49:09
  • 详解C#如何实现隐式类型转换

    2022-08-30 06:32:42
  • SpringMvc MultipartFile实现图片文件上传示例

    2022-07-30 16:40:45
  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    2023-10-13 07:24:29
  • Android 静默安装实现方法

    2021-08-04 05:11:25
  • asp之家 软件编程 m.aspxhome.com