C++之纯虚函数详解

2014-11-24 13:10:50 · 作者: · 浏览: 0
如果基类定义了一个虚函数,而继承类又没有重载这个虚函数,那么在基类和继承类各自的虚函数表里, 它们的虚函数地址是一样的,而如果重载这个虚函数,两个虚函数表里面的虚函数的地址就不同。因此特地对这个说法在visual c 6.0 的平台下做了一个验证。请看:
1、当继承类没有重载基类定义的虚函数时
#include
class A
{
public:
virtual void f()
{
cout<<"class A"< };
};

class B:public A{};

int main()
{
A *pa=new A;
int *paadd=(int*)(*(int*)pa);
int *paaddr=(int*)(*(int*)paadd);
cout< A *pb=new B;
int *pbadd=(int*)(*(int*)pb);
int *pbaddr=(int*)(*(int*)pbadd);
cout< delete pa;
delete pb;
return 0
}

输出确实一样,都为0x00401028(注:不同的机器上地址可能不同)

2、当继承类重载了基类定义的虚函数时
#include
class A
{
public:
virtual void f()
{
cout<<"class A"< };
};
class B:public A
{
public:
virtual void f()
{
cout<<"class B"< };
};
int main()
{
A *pa=new A;
cout< int *paadd=(int*)(*(int*)pa);
int *paaddr=(int*)(*(int*)paadd);
cout< A *pb=new B;
int *pbadd=(int*)(*(int*)pb);
int *pbaddr=(int*)(*(int*)pbadd);
cout< delete pa;
delete pb;
return 0;
}
这时,基类的虚函数的地址为:0x00401028,而继承类的虚函数地址为:0x00401032