C++ 虚函数 修改虚表
2011-07-20 18:16
211 查看
#include<iostream> #include<stdio.h> using namespace std; class CC { public: virtual void Print() { cout<<"CC"<<endl; } } ; class Cst:public CC { private: int a; int b; public: Cst(int a,int b):a(a),b(b) { } Cst() { } virtual void Print() {cout<<"first virual"<<endl;} char* name; }; int main() { Cst ss(0xFFFF,0xFFFF); ss.name =NULL; int* ptr = reinterpret_cast<int*>(&ss); *ptr = 0xFFFFFFFF; //修改vptr指针,但是貌似虚函数还可以找到,对象还可以调用Print() //对象中指向该类的续表的指针vptr我都改动了,怎么还可以啊。?????? printf("%p\n",*ptr); ss.Print();//怎么还可以访问啊 system("pause"); return 0; } 为什么改动了对象的虚表,对象还可以找到虚函数,访问????????
//因为我并没有用虚函数寻址,我直接用对象调用。那么是普通函数的调用。没有用到虚函数。下面的就有问题了#include<iostream> #include<stdio.h> using namespace std; class CC { public: virtual void Print() { cout<<"CC"<<endl; } } ; class Cst:public CC { private: int a; int b; public: Cst(int a,int b):a(a),b(b) { } Cst() { } virtual void Print() {cout<<"first virual"<<endl;} char* name; };
void chengedPrintf() { cout << 1<<endl; }
int main() { Cst* ss = new Cst(0xFFFF,0xFFFF); ss->name =NULL; int* ptr = reinterpret_cast<int*>(ss); int* pchengd = reinterpret_cast<int*>(chengedPrintf); *ptr = (int)(&pchengd); ss->Print(); //这个时候修改了函数地址了,访问时 chengedPrintf system("pause"); return 0; }
相关文章推荐
- 从汇编层面深度剖析C++虚函数
- c/c++语言实现堆栈修改,通过ret跳转到自定义函数
- C++虚函数和纯虚函数区别
- C++ 虚函数
- C/C++学习----第三章 多态性和虚函数
- 用C++修改本地安全策略
- C++中抽象类、虚函数和纯虚函数与Java中相关概念的对比
- C++虚函数 - 静态函数能否为虚函数 .
- 如何在C中调用C++函数 与 如何在C++中调用C的函数(待修改)
- C++中的虚函数(virtual function)
- c++ 继承 虚函数与多态性 重载 覆盖 隐藏
- c++ 虚函数的实现机制:笔记
- C/C++ 函数指针、虚函数、纯虚函数
- C++开发人脸性别识别教程(18)——辅助功能之文件名批量修改、方法验证
- 从一道题分析C++虚函数机制
- C++ 虚函数与纯虚函数
- C++虚函数调用的反汇编解析
- C++函数中那些不可以被声明为虚函数的函数
- 虚函数、虚继承——C++
- 详解C++中的多态、虚函数、父类子类