博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++虚函数表理解
阅读量:6616 次
发布时间:2019-06-25

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

一,思维模式图

二,代码验证

class A {public:    A(int x) {        fProtected = x;    }    float GetFProtected() {        return fProtected;    }public:    float fpublic = 2.3f; //c++11支持了初始化,但不能使用auto    string sname = "liqi";    CMyNumOperator
* on = new CMyNumOperator
(); //对象也可以 void TestFunc() { cout << "TestFunc" << endl; } static void StaticTestFunc() { cout << "Static-TestFunc" << endl; } virtual void ToString() { cout << "A::ToString" << endl; }protected: float fProtected; void ProtectedFunc() { cout << "PRotectedFunc" << endl; }private: void PrivateFunc() { cout << "PrivateFunc" << endl; }};//只管公有继承,不管保护继承和私有继承,意义不大,也太复杂class B : public A {public: friend void TestProtectedDerive(); B() :A(1) {} void TestForDerive() { //公有继承下 //1,子类可以访问父类的保护成员,不能访问父类的私有成员 B ob; //PrivateFunc(); //error,子类不能访问基类的私有成员 ProtectedFunc(); //right fProtected = 10; //right ob.fProtected = 20; //right } //1,c++中只要基类有相同签名虚函数,则默认为此基类函数也是虚函数[与C#不同],如下情形都成立 // (1) 函数不声明 virtual // (2) 函数声明了 virtual // (3) 函数声明了 override // (4) 函数声明了 virtual 和 override //2,c++中两个关键词作用不同,可以同时存在 // virtual仅表明函数是虚函数,override是C++11中出现的,明确说明是对基类的重写 // 它的好处是当函数声明不符合规则时,编译器会报错 void virtual ToString() override{ cout << "B::ToString" << endl; }};void TestVirtualFunctionTable() { cout << hex; typedef void(*PFUNC)(); offsetof(A, fpublic); //利用此函数可以算函数布局 A oa(0); B ob; //一,通过内存地址修改不可访问的保护变量 *(float*)((int*)&oa + 1) = 123.4f; //类的第一个变量fpublic赋值,(int*)&oa + 1是跳过虚函数指针 float fpublic = oa.fpublic; //二,通过内存地址调用虚函数 //A和B的虚函数表地址不一样,也就是说父类和子类各有一张虚函数表 int* pvptr = (int*)(*((int*)(&oa))); cout << "A的虚函数表地址:" << pvptr << endl; //000DB0D4 ((void(*)())(*pvptr))(); //A::ToString pvptr = (int*)(*((int*)(&ob))); cout << "B的虚函数表地址:" << pvptr << endl; //000DB128 ((void(*)())(*pvptr))(); //B::ToString cout << "--------------------------" << endl; //最简写法 ((void(*)())(*((int*)*(int*)&oa)))(); ((void(*)())(*((int*)*(int*)&ob)))();}

 

转载于:https://www.cnblogs.com/timeObjserver/p/9337813.html

你可能感兴趣的文章
敏友的【敏捷个人】有感(11): 敏捷个人线下活动有感
查看>>
刺激用户危机意识,实现快速盈利的营销思维
查看>>
JUnit单元测试
查看>>
[logstash-input-file]插件使用详解
查看>>
植物大战僵尸
查看>>
原创文章
查看>>
理解JavaScript私有作用域
查看>>
BZOJ 1012: [JSOI2008]最大数maxnumber【线段树单点更新求最值,单调队列,多解】
查看>>
Drupal 7模板(主题钩子)的建议
查看>>
nginx配置文件中location说明
查看>>
连载-第1章绪论 1.1嵌入式系统概述
查看>>
UltraVNC
查看>>
详解synchronized
查看>>
Spring Cloud第二篇 创建一个Eureka Server
查看>>
初探数据双向绑定
查看>>
Webpack4 不深不浅的实践教程
查看>>
nginx1.9+做TCP代理(端口转发)
查看>>
HTML元素的默认CSS设置介绍
查看>>
CSS-图片不变形设置
查看>>
Git异常:fatal: could not create work tree dir 'XXX': No such file or directory
查看>>