
C++对象模型
文章平均质量分 74
C++对象模型
NGC_2070
纸上得来终觉浅,绝知此事要躬行!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
(C++对象模型):RTTI运行时类型识别回顾与存储位置介绍
RTTI(运行时类型识别)简单回顾class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; } virtual ~Base() {} };原创 2020-11-10 18:09:17 · 567 阅读 · 0 评论 -
(C++对象模型):多重继承第二基类对虚函数支持的影响(thunk作用)及虚继承下的虚函数
多重继承第二基类对虚函数支持的影响(this指针调整作用)子类继承了几个父类,子类就有几个虚函数表class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" <<原创 2020-11-09 20:33:28 · 309 阅读 · 0 评论 -
(C++对象模型):多继承虚函数深释、第二基类,必加虚析构
多继承下的虚函数class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; } };class Base2{public: virtua原创 2020-11-09 19:39:18 · 200 阅读 · 0 评论 -
(C++对象模型):单继承虚函数测试和回顾
单继承虚函数测试和回顾单继承下的虚函数class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; }};class Derive :pub原创 2020-11-09 14:58:38 · 106 阅读 · 0 评论 -
(C++对象模型):静动态类型、绑定,坑点,多态体现深谈
目录静动态类型、绑定,坑点,多态体现深谈静态类型和动态类型静态绑定和动态绑定继承的非虚函数坑虚函数的动态绑定重新定义虚函数的缺省参数坑c++ 中的多态性的体现静动态类型、绑定,坑点,多态体现深谈静态类型和动态类型静态类型:对象定义时的类型,编译期间就确定好的 动态类型:对象目前所指向的类型(运行的时候才决定的类型) 一般只有指针或者引用才有动态类型的说法,而且一般都是指父类的指针或者引用 class Base{public: };class原创 2020-11-09 14:34:01 · 226 阅读 · 0 评论 -
(C++对象模型):虚函数地址问题的vcall引入
虚函数地址问题的vcall引入class MYACLS{public: virtual void myvirfunc1() { } virtual void myvirfunc2() { }};int main(){ printf("MYACLS::myvirfunc1()地址=%p\n", &MYACLS::myvirfunc1); //打印的是vcall函数(代码)地址,而不是真正的虚函数; printf("MYACLS::myvirfunc2()地址=%原创 2020-11-09 13:11:41 · 360 阅读 · 0 评论 -
(C++对象模型):虚函数、静态成员函数调用方式
虚成员函数(虚函数)调用方式class MYACLS{public: int m_i; void myfunc(int abc) { //m_i += abc; //这里需要用到this指针,而this指针为空,则会报告异常 mystfunc(); } virtual void myvirfunc() { printf("myvirfunc()被调用,this = %p\n", this); }};int main(){ //一:虚成员函数(虚函数)调原创 2020-11-08 22:36:50 · 505 阅读 · 0 评论 -
(C++对象模型):普通成员函数调用方式
普通成员函数调用方式class MYACLS{public: int m_i; void myfunc(int abc) { m_i += abc; } };void gmyfunc(MYACLS *ptmp,int abc){ ptmp->m_i += abc;}int main(){ MYACLS myacls; myacls.myfunc(18); //调用成员函数 gmyfunc(&myacls, 18); //调用全局函数 re原创 2020-11-08 21:25:22 · 1334 阅读 · 0 评论 -
(C++对象模型):成员变量地址、偏移、指针等重申
目录对象成员变量内存地址及其指针成员变量的偏移值及其指针(和具体对象无关)没有指向任何数据成员变量的指针对象成员变量内存地址及其指针class MYACLS{public: int m_i; int m_j; int m_k;};int main(){ MYACLS myobj; myobj.m_i = myobj.m_j = myobj.m_k = 0; printf("myobj.m_i = %p\n", &myobj.m_i); //对象的原创 2020-11-08 20:51:13 · 784 阅读 · 0 评论 -
(C++对象模型):三层结构时虚基类表内容分析
三层结构时虚基类表内容分析class Grand //爷爷类{public: int m_grand;};class A1 : virtual public Grand{public: int m_a1;}; class A2 : virtual public Grand{public: int m_a2;}; class C1 :public A1, public A2{public: int m_c1;}; int main(){ cout &l原创 2020-11-08 19:05:49 · 151 阅读 · 0 评论 -
(C++对象模型):两层结构时虚基类表内容分析
两层结构时虚基类表内容分析虚基类表内容之5-8字节内容分析虚基类表 一般是8字节,四个字节为一个单位。每多一个虚基类,虚基类表会多加4个字节class Grand //爷爷类{public: int m_grand;};class A1 : virtual public Grand{public: int m_a1;}; class A2 : virtual public Grand{public: int m_a2;}; class C1 :public A原创 2020-11-08 16:11:47 · 351 阅读 · 0 评论 -
(C++对象模型):虚基类(虚继承/虚派生)问题的提出和初探
虚基类(虚继承/虚派生)问题的提出class Grand //爷爷类{public: int m_grand;};class A1 : public Grand{public: };class A2 : public Grand{public: };class C1 :public A1, public A2{public: };int main(){ cout << sizeof(Grand) << endl; cout原创 2020-11-08 13:01:06 · 210 阅读 · 0 评论 -
(C++对象模型):多重继承数据布局与this调整深谈
目录单一继承数据成员布局this指针偏移知识补充多重继承且父类都带虚函数的数据成员布局一个类对象中的成员定位是this指针(编译器会自动调整)加该成员相对this指针偏移值父类的指针指向子类模型分析拓展:三重继承且父类都带虚函数的数据成员布局单一继承数据成员布局this指针偏移知识补充class Base{public: int m_bi; Base() { printf("Base1::Base()的this指针是:%p!\n", this); }.原创 2020-11-06 23:41:08 · 637 阅读 · 0 评论 -
(C++对象模型):单类单继承虚函数下的数据成员布局
目录单类单继承虚函数下的数据成员布局单个类带虚函数的数据成员布局单一继承父类带虚函数的数据成员布局单一继承父类不带虚函数的数据成员布局单类单继承虚函数下的数据成员布局类中引入虚函数时,会有额外的成本付出编译的时候,编译器会产生虚函数表 对象中会产生 虚函数表指针vptr,用以指向虚函数表的 增加或者扩展构造函数,增加给虚函数表指针vptr赋值的代码,让vptr指向虚函数表; 如果多重继承,比如继承了2个父类,每个父类都有虚函数的话,每个父类都会有vptr,那继承时,子原创 2020-11-06 18:36:25 · 181 阅读 · 0 评论 -
(C++对象模型):单一继承下的数据成员布局
单一继承下的数据成员布局class FAC //父类{public: int m_fai; int m_faj;};class MYACLS :public FAC //子类{public: int m_i; int m_j;};int main(){ printf("FAC::m_fai = %d\n", &FAC::m_fai); printf("FAC::m_faj = %d\n", &FAC::m_faj); printf("MYACL原创 2020-11-06 17:41:04 · 146 阅读 · 0 评论 -
(C++对象模型):静态与普通成员变量的存取
目录静态成员变量的存取非静态成员变量的存取(普通的成员变量)静态成员变量的存取静态成员变量,可以当做一个全局量,但是他只在类的空间内可见;引用时用 类名::静态成员变量名 静态成员变量只有一个实体,保存在可执行文件的数据段的;class MYACLS public: int m_i; static int m_si; //声明而不是定义,只是一个符号标记,此时不分配内存 int m_j;};int MYACLS::m_si = 10; //这个是定义,在内存空间中分原创 2020-11-06 16:25:52 · 310 阅读 · 0 评论 -
(C++对象模型):数据成员布局
目录数据成员布局观察成员变量地址规律边界调整,字节对齐成员变量偏移值的打印数据成员布局观察成员变量地址规律class MYACLS{public: int m_i; static int m_si; //声明不是定义 int m_j; static int m_sj; int m_k; static int m_sk; };int main(){ MYACLS myobj; cout << sizeof(myobj) <原创 2020-11-06 00:05:24 · 151 阅读 · 0 评论 -
(C++对象模型):进程内存空间布局
进程内存空间布局当运行一个可执行文件时,操作系统就会把这个可执行文件加载到内存,此时进程有一个虚拟的地址空间(内存空间)演示代码#include <iostream>#include <time.h >#include <stdio.h>using namespace std;int *ptest = new int(120);int g1;int g2;int g3 = 12;int g4 = 32;int g5;int g6原创 2020-11-05 20:39:48 · 280 阅读 · 0 评论 -
(C++对象模型):数据成员绑定时机
数据成员绑定时机string mytype; //全局量,字符串型//定义一个类class A{public: int myfunc(); { return myvar; }private: int myvar; //同全局变量名相同,但类型不同。 };编译器是对成员函数myfunc的解析,是整个A类定义完毕后才开始的 所以,对这个myvar的解析和绑定,是在这个类定义完成后发生的。string mytype; //全局量,字符串型//定义一个类c原创 2020-11-05 18:28:11 · 190 阅读 · 0 评论 -
(C++对象模型):单纯的类不纯时引发的虚函数调用问题
单纯的类不纯时引发的虚函数调用问题单纯的类:比较简单的类,尤其不包含 虚函数和虚基类class X{public: int x; int y; int z; X() :x(0), y(0), z(0) { cout << "构造函数被执行" << endl; } X(const X &tm) :x(tm.x), y(tm.y), z(tm.z) { cout << "拷贝构造函数被执行" << endl; }}原创 2020-11-05 16:47:58 · 158 阅读 · 0 评论 -
(C++对象模型):虚函数表查看工具,vptr、vtbl创建时机
虚函数表查看工具,vptr、vtbl创建时机#include <iostream>using namespace std;//基类1class Base1{public: virtual void f() { cout << "base1::f()" << endl; } virtual void g() { cout << "base1::g()" << endl; }};//基类2class Ba原创 2020-11-05 15:00:05 · 695 阅读 · 0 评论 -
(C++对象模型):多重继承虚函数表分析
多重继承虚函数表分析//基类1class Base1{public: virtual void f() { cout << "base1::f()" << endl; } virtual void g() { cout << "base1::g()" << endl; }};//基类2class Base2{public: virtual void h() { cout << "base2::h原创 2020-11-05 13:46:24 · 650 阅读 · 0 评论 -
(C++对象模型):虚函数表分析
虚函数表分析class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; }};class Derive :public Base { vir原创 2020-11-05 11:18:08 · 268 阅读 · 0 评论 -
(C++对象模型):继承关系作用下虚函数的手工调用
继承关系作用下虚函数的手工调用探究1:class Base{public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cout << "Base::g()" << endl; } virtual void h() { cout << "Base::h()" << endl; }};class Derive :publ原创 2020-11-04 20:54:26 · 189 阅读 · 0 评论 -
(C++对象模型):虚函数表指针位置分析
虚函数表指针位置分析类 有虚函数,这个类会产生一个虚函数表 类对象 有一个指针,指针(vptr)会指向这个虚函数表的开始地址 class A{public: int i; virtual void testfunc() {} //虚函数,windows下vptr4字节,linux下8字节};int main(){ A aobj; int ilen = sizeof(aobj); cout << ilen << endl; /原创 2020-11-04 17:51:40 · 633 阅读 · 0 评论 -
(C++对象模型):成员初始化列表
成员初始化列表何时必须用成员初始化列表 如果这个成员是个引用 如果是个const类型成员 如果有一个类是继承一个基类(基类中有带参的构造函数) class Base{public: int ba; int bb; Base(int tmpa, int tmpb) { }};class A:public Base{public: A(int &tmpvalue):Base(tmpvalue, tmpvalue) { ...原创 2020-11-04 16:38:41 · 203 阅读 · 0 评论 -
(C++对象模型):程序优化续、拷贝构造续,深浅拷贝
目录程序优化续、拷贝构造续,深浅拷贝程序优化续拷贝构造续深浅拷贝程序优化续、拷贝构造续,深浅拷贝程序优化续class X{public: int m_i; X(const X& tmpx) { m_i = tmpx.m_i; cout << "拷贝构造函数被调用" << endl; } X() //缺省构造函数 { cout << "构造函数被调用" << endl; } ~X()原创 2020-11-04 12:48:45 · 144 阅读 · 0 评论 -
(C++对象模型):程序的优化
程序的优化#include <iostream>using namespace std;class CTempValue{public: int val1; int val2;public: CTempValue(int v1 = 0, int v2 = 0) :val1(v1), val2(v2) //构造函数 { cout << "调用了构造函数!" << endl; cout << "val1 = " <<原创 2020-09-18 23:12:33 · 195 阅读 · 0 评论 -
(C++对象模型):程序转化语义
程序转化语义我们写的代码,编译器会对代码进行拆分,拆分成编译器更容易理解和实现的代码。 看一看编译器是如何解析这些代码的。 站在程序员角度/站在编译器角度 程序员看代码视角 和 编译器看代码视角之间不断切换。定义时初始化对象class X{public: int m_i; X(const X& tmpx) { m_i = tmpx.m_i; cout << "拷贝构造函数被调用" << endl; } X() { m_.原创 2020-09-18 19:33:22 · 203 阅读 · 0 评论 -
(C++对象模型):拷贝构造函数语义
目录引例① 如果一个类A没有拷贝构造函数,但是含有一个类类型CTB的成员变量m_ctb。该类型CTB含有拷贝构造函数,那么当代码中有涉及到类A的拷贝构造时,编译器就会为类A合成一个拷贝构造函数。② 如果一个类CTBSon没有拷贝构造函数,但是它有一个父类CTB,父类有拷贝构造函数,当代码中有涉及到类CTBSon的拷贝构造时,编译器会为CTBSon合成一个拷贝构造函数 ,调用父类的拷贝构造函数。③如果一个类CTBSon没有拷贝构造函数,但是该类声明了或者继承了虚函数,当代码中有涉及到类CTB.原创 2020-09-17 22:42:55 · 291 阅读 · 0 评论 -
(C++对象模型):构造函数语义(下)
目录构造函数语义①父类带缺省构造函数,子类没有任何构造函数② 如果一个类含有虚函数,但 没有任何构造函数时③如果一个类带有虚基类,编译器也会为它合成一个默认构造函数反汇编查看编译器添加了什么代码构造函数语义①父类带缺省构造函数,子类没有任何构造函数因为父类这个缺省的构造函数要被调用,所以编译器会为这个子类合成出一个默认构造函数。 合成的目的是为了调用这个父类的构造函数。 换句话说,编译器合成了默认的构造函数,并在其中安插代码,调用其父类的缺省构造函数。#inclu..原创 2020-09-17 20:18:44 · 305 阅读 · 0 评论 -
(C++对象模型):分析obj目标文件,构造函数语义(上)
目录默认构造函数介绍在windows下怎么看obj文件编译器会在哪些必要的时候帮助我们把默认的构造函数合成出来呢?增加类对象进行测试调换MATX与MCTX顺序,再次测试默认构造函数默认构造函数(缺省构造函数):没有参数的构造函数 传统认识认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数,我们称这种构造函数为:“合成的默认构造函数” 结论:“合成的默认构造函数”,只有在 必要的时候,编译器才会为我们合成出来,而不是必然或者必须为.原创 2020-09-17 18:29:03 · 1844 阅读 · 0 评论 -
(C++对象模型):this指针调整
目录this指针调整探索示意图总结this指针调整探索#include <iostream>using namespace std;class A {public: int a; A() { printf("A::A()的this指针是:%p!\n", this); } void funcA() { printf("A::funcA()的this指针是:%p!\n", this); }};class B {public: i.原创 2020-09-17 17:28:25 · 242 阅读 · 0 评论 -
(C++对象模型):对象结构的发展和演化
目录对象结构的发展和演化归纳案例探究总结类对象大小的组成对象结构的发展和演化经过多年,c++对象模型逐步建立起来 ①非静态的成员变量(普通成员变量) 跟着类对象走(存在对象内部),也就是每个类对象都有自己的成员变量;class A {public: int a = 100; //非静态成员变量(普通成员变量)};int main(){ A aobj; int ilen = sizeof(aobj); std::cout <&l..原创 2020-09-15 17:56:17 · 226 阅读 · 0 评论 -
(C++对象模型):类对象所占用的空间
目录类对象所占用的空间visual studio 操作类对象所占用的空间解析为什么sizeof(空类)= 1而不是0类的成员函数 不占用 类对象的内存空间增加 char 类型的成员变量增加 int 类型的成员变量结论类对象所占用的空间visual studio 操作F9 设置断点 F5 执行调试 运行程序至断点 Shift + F5 停止调试 Ctrl + F5 执行不调试 Shift + F9 快速监视,查看变量内存...原创 2020-09-15 16:42:47 · 874 阅读 · 0 评论 -
(C++对象模型):开发环境设置
开发平台:windows VS2019设置VC++环境创建工程原创 2020-09-15 15:23:31 · 158 阅读 · 0 评论