首页/ 书法艺术/ 正文
📎 本文网址 http://228551.geci.2211mu.com/243662

虚函数表存放位置虚函数表存放位置解析

✍️ 作者:世界地理 👁 阅读 2,358 💬 评论 36 ⏱ 阅读约 6 分钟

虚函数表存放位置虚函数表存放位置解析

本文目录

  1. 析构函数为什么是虚函数?
  2. c++多态的实现原理?
  3. 先访问一般函数还是虚函数?
  4. 实参和虚参可以共用存储单元?
  5. 虚函数和普通函数的区别?

析构函数为什么是虚函数?

这样会先调用a类的析构函数,再调用b类的析构函数删除掉a类中的virtual 修饰这样只会调用a类的析构函数上面是现象,题主显然问的是原因?

当使用delete pa指向基类的引用时,释放pa所指的内存,而pa所指的是b对象,为什么不会调用b的析构函数呢?这里由于是静态联编,b在编译时已经确定所指向的函数时b的函数,而不会根据对象a来确定指向的函数。如此一来如果b申请的内存资源,但是没有在它的析构函数中释放资源,造成内存泄露。

细想一下,出现虚函数的原因不也是这个吗?

增加了virtual机制,在进行编译的时候,看到virtual就会自动将方法指向b的地址,于是我们就可以通过设置机制找到b的析构函数。

为了改变这个,就出现了虚析构函数

  只要将基类的析构函数设为virtual型,则所有派生类都自动将析构函数设为virtual型,这样子就保证了不会因为析构函数未被调用而导致内存泄露。

c++多态的实现原理?

C++中的多态是通过虚函数和基类指针(或引用)来实现的。以下是多态的基本原理:

1. 基类声明虚函数:在基类中,如果希望派生类能够重写该函数并实现多态行为,需要在函数声明前加上关键字 "virtual"。虚函数使得函数调用可以根据对象的实际类型来确定调用哪个函数。

2. 派生类重写虚函数:派生类可以通过重写(覆盖)基类的虚函数来改变函数的实现。重写的函数需要具有相同的函数签名(函数名称、参数列表和返回类型),以确保正确的多态调用。

3. 基类指针或引用:多态的关键是通过基类的指针或引用来调用派生类的虚函数。当基类指针或引用指向派生类的对象时,可以根据实际对象类型来决定调用哪个虚函数。

4. 运行时动态绑定:C++使用动态绑定(运行时多态)来确定调用哪个函数。当通过基类指针或引用调用虚函数时,实际调用的是派生类的函数,而不是基类的函数。这种动态绑定在运行时根据对象的实际类型来决定。

多态的实现依赖于虚函数表(vtable)和虚函数指针。每个带有虚函数的类都会在对象中维护一个虚函数表,虚函数表中存储了虚函数的地址。当通过基类指针或引用调用虚函数时,实际上会通过虚函数指针查找到正确的函数地址并进行调用。

先访问一般函数还是虚函数?

类中的虚函数是动态生成的,由虚函数表的指向进行访问,不为类的对象分配内存,就没有虚函数表就无法访问。 类中的普通函数静态生成,不为类的对象分配内存也可访问。

实参和虚参可以共用存储单元?

实参和虚参是可以共用同一个内部存储单元.

实际上实参把自己的地址传给虚参.这样他们就都在同一个内存区域了.

实际参数简称“实参”。在调用有参函数时,函数名后面括号中的参数称为“实际参数”,实际参数可以是常量、变量或表达式。

虚函数和普通函数的区别?

虚函数是由指针地址中的数据类型来判断函数使用,而非虚函数则是仅仅看指针类型来调用;因此在非虚的情况下调用的是Animal类型,因为指针也是animal类型;而在虚函数的情况下调用的是fish类型的breathe().

⚠ 温馨提示:知识看完了,记得站起来活动一下,喝杯水,看看窗外——好身体和好奇心一样重要。
📌 声明:本文内容仅供参考,具体操作请咨询专业人士。