对c++虚函数调用机制比较了解的请进来看一下

来源:百度知道 编辑:UC知道 时间:2024/06/30 08:06:15
我写了一个程序改写一个对象的虚函数指针,为什么对虚函数调用没有影响?
#include <iostream>
using namespace std;

struct c1
{
virtual void f1(){cout<<"c1::f1"<<endl;}
};

struct c2:public c1
{
virtual void f1(){cout<<"c2::f1"<<endl;}
};

void main()
{
c1 obj1;
c2 obj2;

cout<<"c1的虚函数表地址:"<<(int*)*(int*)&obj1<<endl;
cout<<"c2的虚函数表地址:"<<(int*)*(int*)&obj2<<endl;
obj2.f1();

*(int*)&obj2 = *(int*)&obj1;//把obj1的虚函数指针赋给obj2

cout<<"c1的虚函数表地址:"<<(int*)*(int*)&obj1<<endl;
cout<<"c2的虚函数表地址:"<<(int*)*(int*)&obj2<<endl;
obj2.f1();
}

我机器上的结果:
c1的虚函数表地址:0046C054
c2的虚函数表地址:0046C060
c2::f1
c1的虚函数表地址:0046C054
c2的虚函数表地址:0046C054
c2::f1
Press any key to continue
为什么obj2的虚函数指针都变了,调

通过指针或引用调用的虚函数才有效,否则不会去查虚地址表,写成如下就如你所愿了:
void main()
{
c1 obj1;
c2 obj2;
c1 *pc1 = &obj2;
c2 *pc2 = &obj2;

cout<<"c1的虚函数表地址:"<<(int*)*(int*)&obj1<<endl;
cout<<"c2的虚函数表地址:"<<(int*)*(int*)&obj2<<endl;
//obj2.f1(); 这样调用虚地址表无效
pc1->f1();
pc2->f1();

*(int*)&obj2 = *(int*)&obj1;

cout<<"c1的虚函数表地址:"<<(int*)*(int*)&obj1<<endl;
cout<<"c2的虚函数表地址:"<<(int*)*(int*)&obj2<<endl;
//obj2.f1(); 这样调用虚地址表无效
pc1->f1();
pc2->f1();
}

c1的虚函数表地址:0x444ca0
c2的虚函数表地址:0x444cb0
c2::f1
c2::f1
c1的虚函数表地址:0x444ca0
c2的虚函数表地址:0x444ca0
c1::f1
c1::f1