32位环境中对于有虚函数类对象的虚函数表指针内容修改并不会使程序崩溃问题

C++语言 码拜 9年前 (2016-06-09) 1047次浏览
环境:vs2015,32位编译环境。
现象:

public:
	int a;
	int b;
	virtual void fun() { cout << "fdsa"; }
	Test(int temp1 = 0, int temp2 = 0)
	{
		a = temp1;
		b = temp2;
	}
	int getA()
	{
		return a;
	}
	int getB()
	{
		return b;
	}
};
int main()
{
	Test obj(5, 10);
	int* pInt = (int*)&obj;
	//*(int*)*(int*)(*pInt) = 100;//这个会出错
	cout << *pInt <<endl;
	*pInt = 100;//这个不会出错
	cout << *pInt << endl;
	obj.fun();
        return 0;
}

问题:本人修改了Test对象的虚函数表指针的值,也就是虚函数表的地址,但是obj.fun()依然可以正常工作,这是为什么呢?本人假如修改在深层一次,该虚函数表的第一项数据即fun指针的地址,程序就崩了,这个可以理解。以上,求帮助,谢谢!

解决方案

10

一楼正解,c++只有指针和引用才会有多态,你用变量直接调用虚函数这是静态绑定的,不需要访问虚表

5

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

5

只有使用引用和指针才会呼叫虚表中的方法。虚表中的方法,修改 this 参数后呼叫原始函数。
直接使用对象,会直接呼叫原始的函数。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明32位环境中对于有虚函数类对象的虚函数表指针内容修改并不会使程序崩溃问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)