C++之纯虚函数详解
如果基类定义了一个虚函数,而继承类又没有重载这个虚函数,那么在基类和继承类各自的虚函数表里, 它们的虚函数地址是一样的,而如果重载这个虚函数,两个虚函数表里面的虚函数的地址就不同。因此特地对这个说法在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
补充:软件开发 , C++ ,