当前位置: 首页 > news >正文

手机网站关键词优化软件企业宣传册模版

手机网站关键词优化软件,企业宣传册模版,自己做qq代刷网站要钱吗,广西智能网站建设平台文章目录前言一、构造函数二、详细探究总结前言 本文较为详细的研究了C中包含虚函数继承体系中对象的构造和析构过程。 一、构造函数 class Base { public:Base() { v_func(); }virtual void v_func() {printf("base fun\n");} };class Derived : public Base { pu…

文章目录

  • 前言
  • 一、构造函数
  • 二、详细探究
  • 总结


前言

本文较为详细的研究了C++中包含虚函数继承体系中对象的构造和析构过程。


一、构造函数

class Base
{
public:Base() { v_func(); }virtual void v_func() {printf("base fun\n");}
};class Derived : public Base
{
public:Derived() { v_func(); }void v_func() override{printf("derived fun\n");}
};int main()
{Derived d;
} 

将输出:

base fun
derived fun

解释:
调用Derived构造函数,在初始化列表中隐式调用Base构造函数,在构造函数体中不触发动态绑定,所以调用的是Base::v_func,然后再调用Derived::v_func。

二、详细探究

#include <functional>
#include <stdio.h>class Base
{
public:Base() {  this->v_func(); printf("base vptr:%p\n", *(char**)this); }virtual void v_func2() {}virtual void v_func() {printf("base fun\n");}virtual ~Base() {printf("~Base\n");}
};class Derived : public Base
{
public:Derived() { this->v_func(); printf("derived vptr:%p\n", *(char**)this); }void v_func() override{printf("derived fun\n");}void normal_call_test(){printf("normal_call_test\n");}virtual ~Derived(){printf("~Derived\n");}
};int main()
{Base b;printf("XXbase vptr: %p\n", *(char**)&b);Base b2;printf("XXbase vptr: %p\n", *(char**)&b2);Derived d;printf("%d\n", &Base::v_func2);printf("%d\n", &Base::v_func);printf("%d\n", &Derived::v_func);printf("d vptr: %p\n", *(char**)&d);std::bind(&Base::v_func, &d)();std::bind(&Derived::v_func, &d)();}

输出:

base fun
base vptr:0x557ff12cf8    # 基类虚表地址
XXbase vptr: 0x557ff12cf8
base fun
base vptr:0x557ff12cf8
XXbase vptr: 0x557ff12cf8
base fun
base vptr:0x557ff12cf8    # 在构造base类部分时vptr指向基类虚表
derived fun
derived vptr:0x557ff12cc8 # 在构造子类部分时vptr又指向了子类虚表
0
8  # 虚函数的地址是个数
8
d vptr: 0x557ff12cc8      # 对象的头8个字节存放该类的虚表指针
derived fun               # 具体调用的函数由对象的实际类型决定
derived fun
~Derived
~Base
~Base
~Base
构造阶段对象类型 (动态类型)虚函数表指针 (vptr)指向 v_func() 调用结果
​​进入 Base 构造函数​​BaseBase 类的虚函数表 (vtable)Base::v_func() (打印 “base fun”)
​​进入 Derived 构造函数​​ DerivedDerived 类的虚函数表 (vtable)Derived::v_func() (打印 “derived fun”)
  1. 构建 Derived 对象 d​​:当执行 Derived d; 时,首先调用基类 Base 的构造函数。

  2. ​​在 Base 构造函数中调用 v_func()​​:

    • 此时,Derived 类的部分尚未构造,编译器认为对象的当前类型是 Base。
    • 对象的​​虚函数表指针(vptr)​​ 此时指向 Base 类的虚函数表。 因此,对 v_func() 的调用会​​静态绑定​​到 Base::v_func(),所以第一行输出是 base fun。
  3. ​​进入 Derived 构造函数​​:Base 部分构造完成后,开始构造 Derived 部分。

  4. 在 Derived 构造函数中调用 v_func()​​:

    • 此时,对象的 Base 部分已初始化完成,对象的完整类型已被视为 Derived。
    • 虚函数表指针(vptr)已经指向 Derived 类的虚函数表。 因此,这里的 v_func() 调用会正常使用虚函数机制,​​动态绑定​​到 Derived::v_func(),所以输出 derived fun。

总结

  • 避免在构造/析构函数中调用虚函数​​: 正如你的代码所展示的,在构造函数中调用虚函数无法实现多态行为。因为这可能导致未定义行为或错误的结果,所以这被视为一个需要特别注意的不良实践。
  • ​​析构函数中的类似行为​​: 析构过程中也存在类似情况。当析构一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。在基类的析构函数执行期间,对象会被视为基类类型,任何虚函数调用都会静态绑定到基类的实现。
http://www.dtcms.com/a/439989.html

相关文章:

  • 自学php做网站昆明公司网站
  • 辽宁网站建设价格游戏网站模板
  • 建设网站设计重庆网站公司设计方案
  • 网站制作的建设大纲pptphp网站开发文档模板
  • 网站建设是怎么挣钱的wordpress怎么使用插件下载
  • 06_Pandas索引运算
  • 泰安建设厅网站建设局网站建设方案书
  • 怎么看别人网站是哪里做的乐亭中关村建站快车
  • 小迪web自用笔记51
  • 长沙娱乐网站开发新媒体管家
  • keras使用mnist数据集
  • 做定制网站怎么样wow313做宏的网站
  • Linux 进程信号:从进阶特性到实战应用(下)
  • 沈阳网络建网站个人外贸展示型网站建设
  • 主流编程范式解析:从原理到应用场景
  • 公司建立网站的意义浦口区网站建设
  • 青岛网站建设铭盛信息公众号 wordpress
  • 网站建设方案书 内容管理制度域名怎么进入网址
  • 网站建设服务版权归谁建设一个公司网站需要多少钱
  • 微信微网站怎么进入专业网站建设最便宜
  • 阿里指数官方网站短视频营销推广方案
  • 好大夫王建设在线个人网站推广自身网站
  • 长白山开发建设集团网站新网站一般建设空间大小
  • 做废钢铁生意在哪个网站了解wordpress页面调用文章列表
  • 如何制作钓鱼网站网站开发 技术方案
  • 域名网站负责人的责任小型企业网站建设内容
  • 拼图小游戏开发日记 | Day1
  • 绿色在线网站建行官方网站登录
  • 门户网站建设服务收费北京网站建设小鱼在线
  • 做网站排名要懂那些做网站需要了解什么软件