#include "iostream.h"class animal
{
public:
animal *p;
animal()
{
p=this; } void eat()
{
cout<<"animal eat"<<endl;
}
};class fish:public animal
{
public:
    void eat()
{
cout<<"fish eat"<<endl;
}
};fish fi;void main()
{
}看孙鑫的视频,说animal()中出现的this指向的是派生类的地址;
要添加什么代码,如何证明,this指向的是fish对象?

解决方案 »

  1.   

    this是指向当前类的指针
    #include <iostream>
    using namespace std;class animal
    {
    public:
    animal *p;
    animal()
    {
    p=this;}virtual void eat()//这里要设为虚函数
    {
    cout<<"animal eat"<<endl;
    }
    };class fish:public animal
    {
    public:
      void eat()
    {
    cout<<"fish eat"<<endl;
    }
    };fish fi;void main()
    {
    fi.eat();
    fi.p->eat();//p虽然是基类的指针,但指向派生类
    }
      

  2.   

    多继承下可以看出区别#include <iostream>using namespace std;class animal
    {
    public:
    animal *p;
    animal(){ p=this; } void eat()
    {
    cout<<"animal eat"<<endl;
    }
    };//能说中文
    class CanSpeakChs
    {
    public:
    CanSpeakChs(){ bAbility = true; }private:
    bool bAbility;
    };class fish: public animal
    {
    public:
    void eat()
    {
    cout<<"fish eat"<<endl;
    }
    };//会说中文的高级鱼
    class fishX: public CanSpeakChs,public animal
    {
    public:
    void eat()
    {
    cout<<"fistX eat"<<endl;
    }
    };int main()
    {
    fish f; //&f 相当于 fish的this ,p是animal的this,很巧合它们相等
    cout<<&f<<' '<<f.p<<'\n'; fishX fx;
    // 这里就可以看出不同了,&fx相当于fishX的this,p是animal的this,它们不同
    // 因为继承对象的内存布局不同了,fishX首先继承于CanSpeakChs,然后才是animal
    cout<<&fx<<' '<<fx.p<<'\n'; return 0;
    }
      

  3.   

    多态只有在虚函数下才可以实现,否则就是静态绑定方式。所以,改:
    class animal
    {
    public:
    animal *p;
    animal()
    {
    p=this; }virtual void eat()
    {
    cout<<"animal eat"<<endl;
    }此时,
    void main()
    {
    fi.p->eat();
    }输出:  fish eat  
      

  4.   

    两次都输出fish eat还不能说明什么啊?
      

  5.   


    真不好意思我操作错误两次显示animal;多谢指点!
      

  6.   

    大哥您的代码运行之后不能证明什么啊------------------------------那就这样改:#include "iostream.h"class animal
    {
    public:
    animal *p;
    animal()
    {
    p=this; 
    cout<<this<<endl;}输出this指针指向的地址
    }
    virtual void eat()
    {
    cout<<"animal eat"<<endl;
    }
    };class fish:public animal
    {
    public:
      void eat()
    {
    cout<<"fish eat"<<endl;//输出
    }
    };fish fi;void main()
    {
    cout<<&fi<<endl;//输出fi对象的地址}两个地址是相同的。fish fi,调用animal的构造函数,传入this指针,this指向了fi,所以p也指向fi。
      

  7.   

    class animal
    (
       animal *p;
       animal()
         {
            p=this;     }
    );class A:public animal
    {};class B:public A
    {};class C:public B
    {};Class D:public C
    {};能不能这么说,哪个类生成了对象,this就指向哪个类的对象?
      

  8.   

    http://baike.baidu.com/view/2140472.htm
      

  9.   

    能不能这么说,哪个类生成了对象,this就指向哪个类的对象?-------------------------------------------------也可以这样说的。构造函数的调用顺序是从最基类的开始,逐层向下(没有构造函数的的话就免了),如果声明一个D对象,则首先调用A的构造函数,在调用B的,在调用C的,最后调用D自己的。建议看看相关的书籍,或网上搜索一下,有很多的。
      

  10.   

    当前对象的地址(class, struct, or union)
    既然是地址,实际上它可以强制转换为它的任何一个祖先的形式,因为基因的继承关系
    通过this访问类中所有非静态成员(有点多余)
    常用this向其它对象传递当前对象的指针
    this不能被修改