#include <iostream.h>
#include <stdio.h>class ClassA
{
protected:
int a;
public:
  int b;
  int c;
  ClassA(){};
  virtual void run()
  {
     cout<<&a<<endl;
  }
};class ClassB:public ClassA
{
public:
int d;
void run()
{cout<<"派生"<<&a<<endl;}
void go()
{}
};
int main(int argc, char *argv[])
{ClassA a;
cout<<"父类对象a的地址"<<&a<<endl;
cout<<"父类对象a的成员a的地址";
a.run ();
cout<<"父类对象a的成员b的地址";
cout<<&a.b<<endl;
cout<<"父类对象a的成员c的地址";
cout<<&a.c<<endl;
cout<<"父类对象a的成员函数run的地址"<<endl;
printf("0x00%x",ClassA::run);
cout<<endl;ClassB a1;
cout<<"子类对象a1的地址"<<&a1<<endl;
cout<<"子类对象a1的成员a的地址";
a1.run ();
cout<<"子类对象a1的成员b的地址";
cout<<&a1.b<<endl;
cout<<"子类对象a1的成员c的地址";
cout<<&a1.c<<endl;
cout<<"子类对象a1的成员d的地址";
cout<<&a1.d <<endl;
cout<<"子类对象a1的成员函数run的地址"<<endl;
printf("0x00%x",ClassB::run);
cout<<endl;
cout<<"子类对象a1的成员函数run的地址"<<endl;
printf("0x00%x",ClassB::go);
cout<<endl;
//void (ClassA:: *p)()=ClassA::run;
//(a.*p)();*/
return 0;
}

解决方案 »

  1.   

    应该是this指针指向虚函数表吧
      

  2.   

    我理解得虚函数,先把根据this地址得到虚表地址,然后由虚表项里存放的函数指针地址,访问相应的函数,那么基类的虚函数和子类对应的函数地址应该不一样,才可以通过函数指针调用不同的函数
      

  3.   

    printf("0x00%x",a.run);
    ...
    printf("0x00%x",a1.run);
      

  4.   

    虚函数是C++多态性的一种.
    希望这两篇文章能解答你的问题:
    http://www.vckbase.com/document/viewdoc/?id=299
      

  5.   

    to Mackz(在相互)
    我也怀疑是我得函数地址用法错误,但是改成你这样也是一样的
    父类对象a的地址0x0012FF70
    父类对象a的成员a的地址0x0012FF74
    父类对象a的成员b的地址0x0012FF78
    父类对象a的成员c的地址0x0012FF7C
    父类对象a的成员函数run的地址
    0x00401046
    子类对象a1的地址0x0012FF5C
    子类对象a1的成员a的地址派生0x0012FF60
    子类对象a1的成员b的地址0x0012FF64
    子类对象a1的成员c的地址0x0012FF68
    子类对象a1的成员d的地址0x0012FF6C
    子类对象a1的成员函数run的地址
    0x00401046    //地址还是和上面一样
    子类对象a1的成员函数run的地址
    0x0040105a
    Press any key to continue
      

  6.   

    我就不信CSDN没有虚函数高手解释一下
      

  7.   

    非常感谢hwablues(hwa)提供的两篇文章,我有更好的理解,但是还是没解决我的疑问
      

  8.   

    http://community.csdn.net/Expert/topic/3863/3863065.xml?temp=.7807276
    并非倒分