c++中虚函数的地址

        近来对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,可见的确如此阿!呵呵

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值