C++虚函数表理解
一,思维模式图

二,代码验证
class A {
public:
A(int x) {
fProtected = x;
}
float GetFProtected() {
return fProtected;
}
public:
float fpublic = 2.3f; //c++11支持了初始化,但不能使用auto
string sname = "liqi";
CMyNumOperator<int>* on = new CMyNumOperator<int>(); //对象也可以
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() {}
void TestForDerive() {
//公有继承下
//1,子类可以访问父类的保护成员,不能访问父类的私有成员
B ob;
//PrivateFunc(); //error,子类不能访问基类的私有成员
ProtectedFunc(); //right
fProtected = ; //right
ob.fProtected = ; //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();
B ob;
//一,通过内存地址修改不可访问的保护变量
*(float*)((int*)&oa + ) = 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)))();
}
C++虚函数表理解的更多相关文章
- 深入理解C++虚函数表
虚函数表是C++类中存放虚函数的一张表,理解虚函数表对于理解多态很重要. 本次使用的编译器是VS2013,为了简化操作,不用去操作函数指针,我使用到了VS的CL编译选项来查看类的内存布局. CL使用方 ...
- 从逆向的角度去理解C++虚函数表
很久没有写过文章了,自己一直是做C/C++开发的,我一直认为,作为一个C/C++程序员,如果能够好好学一下汇编和逆向分析,那么对于我们去理解C/C++将会有很大的帮助,因为程序中所有的奥秘都藏在汇编中 ...
- 我理解的C++虚函数表
今天拜读了陈皓的C++ 虚函数表解析的文章,感觉对C++的继承和多态又有了点认识,这里写下自己的理解.如果哪里不对的,欢迎指正.如果对于C++虚函数表还没了解的话,请先拜读下陈皓的C++ 虚函数表解析 ...
- 对C++虚函数、虚函数表的简单理解
一.虚函数的作用 以一个通用的图形类来了解虚函数的定义,代码如下: #include "stdafx.h" #include <iostream> using name ...
- 深入理解类成员函数的调用规则(理解成员函数的内存为什么不会反映在sizeof运算符上、类的静态绑定与动态绑定、虚函数表)
本文转载自:http://blog.51cto.com/9291927/2148695 总结: 一.成员函数的内存为什么不会反映在sizeof运算符上? 成员函数可以被看作是类 ...
- C++ 虚函数表与内存模型
1.虚函数 虚函数是c++实现多态的有力武器,声明虚函数只需在函数前加上virtual关键字,虚函数的定义不用加virtual关键字. 2.虚函数要点 (1) 静态成员函数不能声明为虚函数 可以这么理 ...
- C++虚函数及虚函数表解析
一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.纯虚函数(Pure Virtual Functio ...
- 关于C++中虚函数表存放位置的思考
其实这是我前一段时间思考过的一个问题,是在看<深入探索C++对象模型>这本书的时候我产生的一个疑问,最近在网上又看到类似的帖子,贴出来看看: 我看到了很多有意思的答案,都回答的比较好,下面 ...
- c++ 继承类强制转换时的虚函数表工作原理
本文通过简单例子说明子类之间发生强制转换时虚函数如何调用,旨在对c++继承中的虚函数表的作用机制有更深入的理解. #include<iostream> using namespace st ...
随机推荐
- HDU3652 B-number 数位DP第二题
A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- ...
- redis整合异常总结
问题:org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field ' ...
- javascript中typeof用法
JS中的变量是松散类型(即弱类型)的,可以用来保存任何类型的数据. typeof 可以用来检测给定变量的数据类型,可能的返回值: 1. 'undefined' --- 这个值未定义: 2. 'bool ...
- POJ1733 Parity game 【扩展域并查集】*
POJ1733 Parity game Description Now and then you play the following game with your friend. Your frie ...
- python3 的字符串格式判断
在python编程中,我们经常要面临将字符串进行转换的情况,那么字符串是否符合转换的要求呢?python中内置了字符串类的方法供我们使用进行字符串格式的判断. 1.isalnum() 所有字符都是数字 ...
- python 数组反序的方法
arr = np.array(some_sequence) reversed_arr = arr[::-1] do_something(arr) look_at(reversed_arr) do_so ...
- vs2013 + python3.52 + boost1.61, 编译C++库失败
使用vs2013 + python3.52 + boost1.61, 编译C++库, 失败! 提示如下": boost::python::detail::init_module(st ...
- chrome安装vue-devtools
安装方法1: 需正常打开chrome商店,搜索vuejs devtools 安装.chrome://extensions/ 开发者工具-扩展程序下启用: 方法2: github下载插件,npm包安装依 ...
- php基础语法(变量)
PHP常用表现形式: 1.<?php .....这里是php代码 ?> 2.<? .....这里是php代码 ?> 此形式依赖于php.ini中的一项设置: short_ope ...
- win10安装.net3.5 报错解决
在win10光盘里提取“microsoft-windows-netfx3-ondemand-package.cab”安装包 然后放在sxs目录 新建批处理...??Cls@ECHO OFFTITLE ...