使用:“BOOL IsKindOf( const CRuntimeClass* pClass ) const;”来区分。

解决方案 »

  1.   

    回复地真快。。不过我是想搞明白this指针指向的原理。比如在追程序的时候,某个函数一直追到基类,但在基类的函数里又调用了一个虚函数,而该虚函数在派生类修改过的,从而又跑去执行派生类版本的虚函数。就是对这个过程不是很明白。具体调用哪个类版本的虚函数是怎么确定的呢?
    谢谢
      

  2.   

    this 是对象实例的身份,虚函数通过它 ,就知道 ,是什么类。
      

  3.   

    取决于你代码运行时CFrameWnd消息收到的对象等
      

  4.   

    多谢,多谢。再弱弱的问个问题。虚函数也会被编译器默认添加this参数吗,类似成员函数?
      

  5.   

    对象实例都有 this, 虚函数 是 this 指向的 一个 虚 函数 表。
      

  6.   

    基本上明白了。的确是我模糊了this属于对象实例的这个概念。具体调用哪个版本的函数,由两个因素确定,一,是否派生类重定义过这个虚函数,二,具体调用这个虚函数的是哪个对象。像主说的消息是哪个对象接收的,即哪个对象触发调用了这个虚函数。是吧?
    多谢,我可以把我看的这本书扔掉了,上面尽胡说八道
      

  7.   


    class A
    {
    public:
    virtual void Function()
    {
    cout<<"A类函数"<<endl;
    }
    };class B : public A
    {
    public:
    virtual void Function()
    {
    cout<<"B类函数"<<endl;
    }
    };int main()
    {
    A *p1 = new A;
    A *p2 = new A;
    A *p3 = new B;
    p1->Function();
    p2->Function();
    p3->Function();
    }
    this指针调用哪个虚函数,取决于它具体指向什么对象。
    实际上对象内部有一个虚表,具体要调用哪个虚函数,this指针在调用时查虚表就知道了。
    如上图中p1 p2都是指向A类对象,虚表中Function的地址都是0x1181140
    p3指向的是B类对象,虚表中Function的地址就是0x118121c,和p1 p2不一样。
    this指针就是靠这个虚表来知道它是指向谁的,该调用那个子类中的虚函数。
      

  8.   

    这里的回复真是快啊。多谢哈,我是有比较正确的理解了。
    自己画张草图吧~如图:
    ClassA有若干个虚函数。ClassA继承于Class B ,Class B继承于ClassC等等。
    如果ClassA收到消息,并调用virutal fun4, 而该函数按继承关系由父类ClassD,ClassC,Class B 一路继承下来。此时调用的是谁的fun4,则取决于ClassB,ClassC,Class D中哪个最后修改了fun4。比如,ClassB没有修改fun4,而ClassC,Class D都修改了。但调用的是ClassC的fun4。似乎这就是继承和覆盖了吧。
    另外,如果把this指向Class B,那么焦点就是Class B的虚函数表了。分析方法也是一样的。
    对否
      

  9.   

    this指针调用哪个虚函数,取决于它具体指向什么对象。
    实际上对象内部有一个虚表,具体要调用哪个虚函数,this指针在调用时查虚表就知道了。
    如上图中p1 p2都是指向A类对象,虚表中Function的地址都是0x1181140
    p3指向的是B类对象,虚表中Function的地址就是0x118121c,和p1 p2不一样。
    this指针就是靠这个虚表来知道它是指向谁的,该调用那个子类中的虚函数。