您的位置:首页 > 编程语言 > C语言/C++

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;
}




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: