程序员必知:【C++】虚函数表vtable理解

简介: 程序员必知:【C++】虚函数表vtable理解

//代码效果参考:http://www.zidongmutanji.com/bxxx/391412.html

相关知识点

二级指针

不同指针类型的解引用

指针类型转换

对象中的虚函数与成员函数

二级指针

如果一个内存段存储的是一个指针,则指向该内存段的指针至少是一个二级指针。及若p为地址,则p至少是一个二级指针。而p为非地址,则p为一级指针。

不同类型指针的解引用

若p为int型指针,则p解引用的地址长度范围为4个字节;而如果p为一个对象b的指针,则p解引用的地址长度范围为sizeof(b)。

指针类型的转换

如果b为一个对象,则(int)(b)将对象指针类型转换为int型指针;(int**)(int)(b)将b中的前四个字节转换为int型二级指针。

对象中的成员函数与虚函数

成员函数不占用内存空间,而虚函数会占用对象内存起始的4个字节,用以保持虚函数表的起始地址。

虚函数表的遍历

多态的虚函数动态调用体现在在调用虚函数前会先对虚函数表进行遍历来确定需要调用的函数。

子类对虚函数的覆写

子类如果对父类的虚函数覆写,则虚函数表中的相应函数地址会被覆盖为子类的虚函数地址;

程序示例

include

using namespace std;

class B{

public:

virtual void f(){cout["i am f();}

virtual void g(){}

virtual void h(){}

private:

int a;

int b;

int c;

};

typedef void (pdef)(void);

int main{

B b;

cout["对象b的起始地址"[b[endl;

cout["对象b的虚函数表表头地址"[(int)(int)(b)[endl;

cout["虚函数表的第0个函数f()的地址"[*((int)(int)(b)+0)[endl;

cout["虚函数表的第1个函数g()的地址"[((int**)(int)(b)+1)[endl;

cout[["虚函数表的第2个函数h()的地址"[((int)(int)(b)+2)[endl;

pdef p = (pdef)*((int)(int)(b)+0);

p();//调用b.f()

}

下图p为虚函数表的表头地址,由下图可以看出*(p+0)为第一个虚函数的地址。

相关文章
|
7月前
|
自然语言处理 算法 Java
C/C++ 程序员编程规范之注释
C/C++ 程序员编程规范之注释
252 1
|
7月前
|
算法 Linux 程序员
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
嵌入式工程师以及C++程序员到公司就业需要掌握那些技术?
|
7月前
|
存储 程序员 Linux
1024程序员节特辑 | C++入门指南:内存管理(建议收藏!!)
1024程序员节特辑 | C++入门指南:内存管理(建议收藏!!)
60 0
|
2月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
24 5
|
6月前
|
存储 程序员 编译器
C/C++堆栈详细分析,新老程序员必会
C/C++堆栈详细分析,新老程序员必会
190 1
|
7月前
|
存储 编译器 C++
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
|
7月前
|
存储 编译器 C语言
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(下)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
65 1
|
7月前
|
存储 编译器 Linux
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题(中)
从C语言到C++_23(多态)抽象类+虚函数表VTBL+多态的面试题
69 1
|
6月前
|
域名解析 网络协议 程序员
程序员必知:【转】adns解析库——域名解析实例(C++、linux)
程序员必知:【转】adns解析库——域名解析实例(C++、linux)
70 0
|
6月前
|
程序员 C# C++
lpszBlogName C#开发多年中途被迫改行C++但工作中又经常偷偷使用C#的C++程序员
通过AUMID解析出packageFamily,再根据PackageManager解析出安装目录 PackageManager是WinRT的类型,如何在c++中使用WinRT,请参考C++/WinRT 以下代码需要管理员权限才能运行。