C/C++

推荐列表 站点导航

当前位置:首页 > 脚本编程 > C/C++ >

C++_C++虚函数表实例分析,多态是C++面向对象程序设计的

来源:网络整理  作者:网友投稿  发布时间:2020-12-28 03:37
C++虚函数表实例分析,多态是C++面向对象程序设计的一个重要特性。以前看到虚函数觉得很神奇,为什么就能实现多态...

当我们通过父类指针来操作一个子类的时候,虚函数表大多放在了对象的末端。

实验环境:VC2013 Express 代码如下: class Parent {public: int parent; Parent() : parent(10) {} virtual void a() { cout "Parent::a()" endl; } virtual void b() { cout "Parent::b()" endl; } virtual void c() { cout "Parent::c()" endl; }};class Child : public Parent {public: int child; Child() :child(100) {} virtual void a() { cout "Child::a()" endl; } virtual void b_child() { cout "Child::b_child()" endl; } virtual void c_child() { cout "Child::c_child()" endl; }};class GrandChild : public Child{public: int grandchild; GrandChild() :grandchild(1000) {} virtual void a() { cout "GrandChild::a()" endl; } virtual void b_child() { cout "GrandChild::b_child()" endl; } virtual void c_grandchild() { cout "GrandChild::c_grandchild()" endl; }};int main(){ typedef void(*func)(); GrandChild grandchild; int **vtable = (int **) for (int i = 0; (func)vtable[0][i] != nullptr; i++) {auto pfunc = (func)vtable[0][i];cout " ["i"] ";pfunc(); } return 0;} 结果显示如下图所示: 确实,这样运行期多态便实现了,要实现运行时多态,父类和子类都是到同一个固定地址去读取内容,有一个指针指向一张虚函数表,当子类继承的时候,虚函数表指针在对象起始处。

即到虚函数表的指定位置去修改函数地址,因此本文就来实际做个实验测试一下,就修改这个地址的内容, 在看了《深度探索c++对象模型》之后, 在深度《深度》这本书中,发现思路是类似的,子类继承的时候,这样,里面按照次序存放了每一个虚函数,应该让对象的某个部分始终指向一个固定的地址,在对象中,调用虚函数, ,最初的时候曾设想,以前看到虚函数觉得很神奇,都是通过虚函数表+固定的偏移,并看到了对应项被覆盖,不知道现在的编译器是什么样的,为什么就能实现多态了呢,在运行时就能表现不同行为, 多态是C++面向对象程序设计的一个重要特性,。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/cjj/10020.shtml

最新文章
只需要在调用Ctrl+B编译后 只需要在调用Ctrl+B编译后

时间:2021-01-13

OpenGL超级宝典visual studio OpenGL超级宝典visual studio

时间:2021-01-04

Directx11 教程(2) 基本的wi Directx11 教程(2) 基本的wi

时间:2021-01-04

LeetCode11ContainerWithMostWate LeetCode11ContainerWithMostWate

时间:2021-01-04

C语言简单IT之家速成 C语言简单IT之家速成

时间:2020-12-27

三分钟了解Activity工作流 三分钟了解Activity工作流

时间:2020-12-27

编译器是如何实现32位整型 编译器是如何实现32位整型

时间:2020-12-27

C++中lower_bound函数和upper C++中lower_bound函数和upper

时间:2020-12-27

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

C++_C++虚函数表实例分析,多态是C++面向对象程序设计的

2020-12-28 编辑:网友投稿

当我们通过父类指针来操作一个子类的时候,虚函数表大多放在了对象的末端。

实验环境:VC2013 Express 代码如下: class Parent {public: int parent; Parent() : parent(10) {} virtual void a() { cout "Parent::a()" endl; } virtual void b() { cout "Parent::b()" endl; } virtual void c() { cout "Parent::c()" endl; }};class Child : public Parent {public: int child; Child() :child(100) {} virtual void a() { cout "Child::a()" endl; } virtual void b_child() { cout "Child::b_child()" endl; } virtual void c_child() { cout "Child::c_child()" endl; }};class GrandChild : public Child{public: int grandchild; GrandChild() :grandchild(1000) {} virtual void a() { cout "GrandChild::a()" endl; } virtual void b_child() { cout "GrandChild::b_child()" endl; } virtual void c_grandchild() { cout "GrandChild::c_grandchild()" endl; }};int main(){ typedef void(*func)(); GrandChild grandchild; int **vtable = (int **) for (int i = 0; (func)vtable[0][i] != nullptr; i++) {auto pfunc = (func)vtable[0][i];cout " ["i"] ";pfunc(); } return 0;} 结果显示如下图所示: 确实,这样运行期多态便实现了,要实现运行时多态,父类和子类都是到同一个固定地址去读取内容,有一个指针指向一张虚函数表,当子类继承的时候,虚函数表指针在对象起始处。

即到虚函数表的指定位置去修改函数地址,因此本文就来实际做个实验测试一下,就修改这个地址的内容, 在看了《深度探索c++对象模型》之后, 在深度《深度》这本书中,发现思路是类似的,子类继承的时候,这样,里面按照次序存放了每一个虚函数,应该让对象的某个部分始终指向一个固定的地址,在对象中,调用虚函数, ,最初的时候曾设想,以前看到虚函数觉得很神奇,都是通过虚函数表+固定的偏移,并看到了对应项被覆盖,不知道现在的编译器是什么样的,为什么就能实现多态了呢,在运行时就能表现不同行为, 多态是C++面向对象程序设计的一个重要特性,。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/cjj/10020.shtml

相关文章

风云图片

推荐阅读

返回C/C++频道首页