如果基類定義了一個虛函數,而繼承類又沒有重載這個虛函數,那麼在基類和繼承類各自的虛函數表裡, 它們的虛函數地址是一樣的,而如果重載這個虛函數,兩個虛函數表裡面的虛函數的地址就不同。因此特地對這個說法在visual c 6.0 的平台下做了一個驗證。請看:
1、當繼承類沒有重載基類定義的虛函數時
#include<iostream.h>
class A
{
public:
virtual void f()
{
cout<<"class A"<<endl;
};
};
class B:public A{};
int main()
{
A *pa=new A;
int *paadd=(int*)(*(int*)pa);
int *paaddr=(int*)(*(int*)paadd);
cout<<paaddr<<endl;
A *pb=new B;
int *pbadd=(int*)(*(int*)pb);
int *pbaddr=(int*)(*(int*)pbadd);
cout<<pbaddr<<endl;
delete pa;
delete pb;
return 0
}
輸出確實一樣,都為0x00401028(注:不同的機器上地址可能不同)
2、當繼承類重載了基類定義的虛函數時
#include<iostream.h>
class A
{
public:
virtual void f()
{
cout<<"class A"<<endl;
};
};
class B:public A
{
public:
virtual void f()
{
cout<<"class B"<<endl;
};
};
int main()
{
A *pa=new A;
cout<<sizeof(*pa)<<endl;
int *paadd=(int*)(*(int*)pa);
int *paaddr=(int*)(*(int*)paadd);
cout<<paaddr<<endl;
A *pb=new B;
int *pbadd=(int*)(*(int*)pb);
int *pbaddr=(int*)(*(int*)pbadd);
cout<<pbaddr<<endl;
delete pa;
delete pb;
return 0;
}
這時,基類的虛函數的地址為:0x00401028,而繼承類的虛函數地址為:0x00401032