环境: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 参数后呼叫原始函数。
直接使用对象,会直接呼叫原始的函数。
直接使用对象,会直接呼叫原始的函数。