//现在的疑问是:既然虚函数表的访问指针已经被破坏,那怎么又会调到虚的析构函数呢。
#include <iostream>
using namespace std;
class CPoint {
public:
int m_ix;
int m_iy;
CPoint(const int p_ix = 0, const int p_iy = 0) :
m_ix(p_ix), m_iy(p_iy) {
}
int getX() const {
return m_ix;
}
int getY() const {
return m_iy;
}
virtual ~CPoint() { cout<<"调用析构函数"<<endl; }
virtual void fun(){
cout<<"调用fun()"<<endl;
}
};
int main() {
CPoint *pa;
CPoint objPoint(5, 10);
pa=&objPoint;
int* pInt = (int*)&objPoint;
*(pInt+0) = 100; // 企图改变x的值
*(pInt+1) = 200; // 企图改变y的值
cout << "X = " << objPoint.getX() << endl;
cout << "Y = " << objPoint.getY() << endl;
objPoint.fun(); //注意这一行和下面一样的区别,这就证明了无论是否是虚函数,编译器都会为其编译出CPoint@@fun()这种形式函数,但是pa->fun()这种语法形式,编译器会按照虚表的方式访问
pa->fun(); //因为虚函数表已经地址已经被破坏,所以无法访问虚函数
return 0; //在主函数退出时出现了调用析构函数,说明访问虚构函数的方式为成员函数调用,而非虚函数表方式调用
}
/*
第一个是注掉pa->fun()这行
[student@SEP4020 objectmemery]$ ./a.out
X = 200
Y = 10
调用fun()
调用析构函数
[student@SEP4020 objectmemery]$ vim objectmemery.cpp
[student@SEP4020 objectmemery]$ g++ objectmemery.cpp
[student@SEP4020 objectmemery]$ ./a.out
X = 200
Y = 10
调用fun()
段错误
*/