博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用指针访问虚函数表
阅读量:4092 次
发布时间:2019-05-25

本文共 1761 字,大约阅读时间需要 5 分钟。

#include 
#include
using namespace std;class Base {
public: int a; virtual void g() {
cout << "Base::g" << endl; } virtual void h() {
cout << "Base::h" << endl; } virtual void f() {
cout << "Base::f" << endl; }};class Derive : public Base {
public: int a; void print() {
cout << "print" << endl; } virtual void f1() {
cout << "Derive::f1" << endl; } virtual void f() {
cout << "Derive::f" << endl; } virtual void f(char a) {
cout << "Derive::f char a" << endl; } virtual void g() {
cout << "Derive::g" << endl; } virtual void h() {
cout << "Derive::h" << endl; }};int main(int argc, char *argv[]) {
// typedef void(*pFun) (void); using pFun = void (*)(void); {
Base b; cout << "虚函数表地址:" << (long *)(&b) << endl; cout << "虚函数表 — 第一个函数地址:" << (long *)*(long *)(&b) << endl; // Invoke the first virtual function,3种写法等价。。 pFun p1 = reinterpret_cast
(*(long *)(((long *)(&b))[0])); auto p2 = (pFun) ((long *) * (long *)(&b))[1]; pFun p3 = (pFun) * ((long *) * (long *)(&b) + 2); p1(); p2(); p3(); } {
Derive d; // 打印方法1 long **table = (long **)&d; for (int i = 0; i < 7; ++i) {
auto pf = (pFun)table[0][i]; pf(); } /* 打印方法2 for (int i = 0; i < 7; ++i) { auto pf = (pFun)(long)((long *) * (long *)(&d))[i]; pf(); } */ } {
// 虽然在Derive虚函数表中有 f1(),但是无法通过父类指针访问没有覆盖的函数 //Base1 *b1 = new Derive(); //b1->f1(); //编译出错 } return 0;}

在这里插入图片描述

转载地址:http://xecii.baihongyu.com/

你可能感兴趣的文章
SQL join
查看>>
JavaScript实现页面无刷新让时间走动
查看>>
CSS实例:Tab选项卡效果
查看>>
前端设计之特效表单
查看>>
前端设计之CSS布局:上中下三栏自适应高度CSS布局
查看>>
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
pinyin4j:拼音与汉字的转换实例
查看>>
XML工具代码:SAX从String字符串XML内获取指定节点或属性的值
查看>>
时间日期:获取两个日期相差几天
查看>>
责任链模式 Chain of Responsibility
查看>>
高并发与大数据解决方案概述
查看>>
解决SimpleDateFormat线程安全问题NumberFormatException: multiple points
查看>>
MySQL数据库存储引擎简介
查看>>
处理Maven本地仓库.lastUpdated文件
查看>>
Kafka | 请求是怎么被处理的?
查看>>
Java并发编程1-线程池
查看>>
CentOS7,玩转samba服务,基于身份验证的共享
查看>>
计算机网络-网络协议模型
查看>>
计算机网络-OSI各层概述
查看>>