首页 > 编程语言 >【侯捷C++面向对象笔记】补充4-object model

【侯捷C++面向对象笔记】补充4-object model

时间:2024-01-30 21:22:46浏览次数:28  
标签:绑定 函数 对象 object C++ 调用 侯捷 class 指针

关键词:虚函数表,动态绑定,多态

每个对象都维护自己的虚表指针,指向类的虚函数表。

(所以对象的size比其包含的所有数据size多4,即虚指针大小)

➡️动态绑定:(多态的实现原理)

  1. 通过指针p找到对象c的vptr
  2. 通过vptr找到class C的vtbl
  3. 在vtbl中找到第n个虚函数并调用

➡️子类调用父类函数隐式传入this指针:

  1. myDoc.OnFileOpen();看似是对象调用函数(静态绑定),但由于调用的是父类的函数CDocument::OnFileOpen(),且其中嵌套了一个虚函数Serialize()
  2. 在调用Serialize()时,实际是调用this->Seialize(),而此时的this为子类对象myDoc
  3. 即该过程其实为动态绑定,通过子类对象的vptr,找到classCmyDoc的虚表,调用重写的Serialize()函数。

➡️静态绑定&动态绑定

对象调用函数 指针调用函数
静态绑定 动态绑定
a.vfunc1(); pa->vfunc1();
a为一个class A对象,调用class A的成员函数 pa为一个class A指针,接收一个class B对象,运行时通过指针调用虚函数

标签:绑定,函数,对象,object,C++,调用,侯捷,class,指针
From: https://www.cnblogs.com/rthete/p/17998013

相关文章

  • 【侯捷C++面向对象笔记】String类
    关键词:动态内存分配,拷贝赋值,new/delete与Complex类最大的差别:有动态分配的内存空间(char*m_data)TipDemo拷贝赋值函数的一般结构拷贝赋值时,检测自我赋值非常重要自己的内存已经释放了,还怎么把自己赋给自己?new时做了什么?1.分配内存2.static_cast为相应类型指针......
  • KY146 魔咒词典C++
    构建一个map,还是查找问题。麻烦点就是要分解输入的过程#include<iostream>#include<string>#include<map>usingnamespacestd;intmain(){stringa,b;map<string,string>m;while(getline(cin,a)){//构建mapb.clear();if(a[0]==......
  • Qt 解决qtcreator工程文件例程报错error: cannot initialize object parameter of typ
    qt下载好并且环境配置完成,kits和qt都已配置完成在qtcreator中,在终端手动编译qmakemake都完全没问题,但是在qtcreator中却报错。即使是新建工程例程都报错。版本qt5.6.0qtcreator4.11.0报错main.cpp:96:error:cannotinitializeobjectparameteroftype‘QWidget’wi......
  • Qt cannot initialize object parameter of type ‘QWidget‘ with an expression of
    报错如图:qtcreator工程文件例程报错error:cannotinitializeobjectparameteroftype‘QWidget’withanexpressionoftype‘tab_workface’问题分析可能因为qtcreator4.11.0basedonqt5.12版本略微冲突导致。。问题解决帮助->关于插件,将ClangCo......
  • KY27 查找学生信息C++
    用map做查找就行了。#include<iostream>#include<string>#include<map>usingnamespacestd;structnode{stringname;stringx;intage;};typedefstructnodesinfo;intmain(){intn;while(cin>>n){map<......
  • c++ - 实现环形队列
    简介队列的核心思想是FIFO(FirstInFirstOut),即先入先出。入队(新增元素)必须从队尾加入,出队(删除元素)必须从队首出去。实现1、需要实现的方法#pragmaonce#include<iostream>usingnamespacestd;#ifndefMYQUEUE_H#defineMYQUEUE_H//环形队列的实现classMyQueue{......
  • JS遍历对象的方法 Object.keys() Object.values()
    1.Object.keys():返回对象可枚举属性组成的数据2.Object.values():返回对象可枚举的属性的属性值,组成的数据letperson={name:'小李',age:'15',}console.log(Object.keys(person));//['name','age']//返回对象可枚举属性组成的数......
  • C++ 避免不必要的复制进行优化的思路
    对于函数传入的参数,如果只是需要读取其中的值,一般来说,除了基础的int类型这种,建议声明为const&类型,这样避免不必要的复制操作。特殊的,std::vector进行增加元素时,可以考虑使用vec[0]=std::move(value),通过转移所有权来避免复制操作,因为vec[0]=value也存在复制操作。不......
  • 【C++】c++中的输入输出;缺省;重载;
    1、c++输入输出#include<iostream>//std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中usingnamespacestd;intmain(){ cout<<"Helloworld!!!"<<endl; return0;}//流插入运算符<<在一个语句中可以多次使用,如上面实例中所示,endl用于在行末添加......
  • vue父子组件数据传递props中Object和Array如何设置默认值
      props:{field:{type:String},index:{type:Number,default:0},isAble:{type:Boolean,default:true},rowData:{type:Object,default:function(){return{};......