C++虚函数在内存中的实现
首先来一张图,一目了然:

然后把相应的代码贴上来:
class A
{
int a; public:
virtual void f();
virtual void g(int);
virtual void h(double);
}; class B : public A
{
public:
int b; void g(int); //overrides A::g()
virtual void m(B*);
}; class C : public B
{
public:
int c; void h(double); //overrides A::h()
virtual void n(C*);
};
后记:(1)每个类的一开始都是一个虚函数指针,这个指针指向一个虚函数表,表中的每一项都是相应的虚函数的指针。
(2)类在继承的时候,一个子类的开始就是基类的部分,了解继承后子类的模型。
(3)vfptr这个指针有范围的,比如A类的vfptr只能看三个记录,B的vfptr能看四个记录,C的vfpr能看五个记录。这就是多态的时候,父类的指针 指向子类对象的时候,它看不到子类的数据成员和成员函数(包括子类中的虚函数)。
(4)一般的面向对象的语言多态基本都是这个原理,前面写了一篇博文,当时说的是基类和派生类的vfptr分开了,其实他们是在一起的,前面之所 以分开说,是为了叙说方便。
C++虚函数在内存中的实现的更多相关文章
- 探索C++虚函数在g++中的实现
本文是我在追查一个诡异core问题的过程中收获的一点心得,把公司项目相关的背景和特定条件去掉后,仅取其中通用的C++虚函数实现部分知识记录于此. 在开始之前,原谅我先借用一张图黑一下C++: “无敌” ...
- C++解析(25):关于动态内存分配、虚函数和继承中强制类型转换的疑问
0.目录 1.动态内存分配 1.1 new和malloc的区别 1.2 delete和free的区别 2.虚函数 2.1 构造函数与析构函数是否可以成为虚函数? 2.2 构造函数与析构函数是否可以发生 ...
- C++成员函数在内存中的存储方式
用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间.按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分 ...
- C++ 虚函数的内存分配
1.无继承的普通类: 在有虚函数的情况下类会为其增加一个隐藏的成员,虚函数表指针,指向一个虚函数表,虚函数表里面就是类的各个虚函数的地址了.那么,虚函数表指针是以什么模型加入到类里面的,虚函数表里 ...
- c++纯虚函数在父类中调用的规避
构造和析构函数不允许调用纯虚函数,可以先调用虚函数,里面再调用纯虚函数实现. class Base{public: virtual void foo()=0; Base() { call_ ...
- c++虚函数、子类中调用父类方法
全部 代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include< ...
- C++程序中不同变量、函数在内存中内存中的分布情况
一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...
- C++中不同变量、函数在内存中的内存情况《转》
一.一个C++编译的程序占用的内存分为以下几个部分 1.栈区:由编译器自动分配 存放函数的参数值,局部变量的值等,操作方式类似于数据结构中的栈. 2.堆区:一般由程序员分配释放,若程序员不释放,程序结 ...
- VS2013命令行界面查看虚函数的内存布局
内存布局可能使用vs的界面调试看到的旺旺是一串数字,很不方便,但是vs的命令行界面可以很直观的显示出一个类中具体的内存布局. 打开命令行.界面如下所示: 测试代码如下所示: class Base1 { ...
随机推荐
- BestCoder Round #3 A,B
A.预处理出来,0(1)输出. Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- android xml布局文件属性说明
android xml布局文件属性说明 [摘]android xml布局文件属性说明 LinearLayout和RelativeLayout 共有属性:java代码中通过btn1关联次控件androi ...
- About Quick Packaging and Custom Packaging
About Quick Packaging and Custom Packaging The Enterprise Manager Support Workbench provides two met ...
- WebView的基本使用
---恢复内容开始--- 一.实例化WebView 通过xml实例化 xml <WebView android:id="@+id/webview" android:layou ...
- Android布局(一)layout_gravity 属性和 gravity属性的区别
安卓中的 layout_gravity 属性和 gravity属性 有啥区别? LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravi ...
- Linux 08
1按照视频里提出的几点要求完善使ls命令模仿windows下dir命令输出的脚本 {printf $6" "$7" \t";if (substr($1,1,1) ...
- 解决Qt4.8.6+VS2010运行程序提示 FTH: (6512): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes
这个问题偶尔碰到两次,现在又遇上了,解决办法如下: 打开注册表,设置HKLM\Software\Microsoft\FTH\Enabled 为0 打开CMD,运行Rundll32.exe fthsvc ...
- 如何实现 Excel方式二维变色提示的 m*n 表格
此代码当m≠n 时,有问题.暂时还未解决此问题. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- java如何防止反编译
综述(写在前面的废话) Java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布 ...
- iOS在Xcode6中添加空模板
1.在Xcode6.0以下版本找到空模板(路径与下方相同). 2.将空模板拖入路径:Macintosh HD ▸ 应用程序 ▸ Xcode(版本号).app ▸ Contents ▸ Develo ...