1。调用基类中的函数.用一个指针保存基类的地址然后。使他指向虚表。再强转成函数指针。
2.调用子类中的函数。用一个基类指针保存子类地址。然后和 1一样。
#include<iostream>
using namespace std;
class bass {
public:
virtual void fun() {
cout << "bass" << endl;
}
};
class sun :public bass {
public:
void fun() {
cout << "sun" << endl;
}
};
int main()
{
bass bass1;
bass1.fun();
sun sun1;
sun1.fun();
bass* pbass;
pbass = &sun1;
pbass->fun();
//void(*p)();
cout << sizeof(bass) << endl;
int* add1 = (int*)&bass1;//指向对象bass1的指针
int* add2 = (int*)*add1;//指向虚函数表的指针
(*(void(*)())(*add2))();//强转函数指针(函数与类型与虚函数类型一致)
int* add3 = (int*)pbass;//基类指针指向子类 pbass=&sun1;
int* add4 = (int*)*add3;//指向虚函数表的指针
(*(void(*)())(*add4))();
cout << hex << ((int*)(*((int*)&sun1))) << endl;//虚表中第一个函数地址也就是基类的函数地址
cout << hex << ((int*)(*((int*)&sun1)) + 1) << endl;//虚表中第二个函数地址也就是子类的函数地址
cin.get();
}
这里用的是 vs2017 版 同时在 xcode9 中编译通过运行出错。同时只要是类型之间转换。会非常严格。
原文地址:http://blog.51cto.com/haidragon/2070770
时间: 2024-11-06 03:33:24