如果CWinThread::Run()中直接像调用OnIdle()的话,那是调用CWinAPP中的
OnIdle()。如果在CWinThread中调用CWinThread::OnIdle()的话,那是调用CWinThread的OnIdle.

解决方案 »

  1.   

    调用的应该是CWinApp的OnIdle虚函数,因为对于纯虚函数的函数指针是指向最终子类的函数的。
      

  2.   

    刚刚调试结果调用的是CWinApp::OnIdle
      

  3.   

    调试结果CWinThread::Run()中的
    if (!PumpMessage())
        return ExitInstance();
    也是调用的CWinApp的ExitInstance();
      

  4.   

    关键是CWinApp::Run()调用了 CWinThread::Run();若只是 CWinThread::Run()自己调用则里边调用的是CWinThread::OnIdle()
      

  5.   

    首先肯定: 调用的是CWinApp的OnIdle(...)我猜你也看过相关方面的书,不过我还是来解释及总结一下,也会你会更明白
    1 函数调用有两种方式:静态束定与动态束定
    2 静态束定就是你的函数调用在编译成目标代码后,就已经确定了(即函数调用地址在编译时就能确定下来)
    3 而动态束定则不同,在编译时还未确定,须等到运行时才会去计算调用函数的地址(中间绕了一个圈)
    4 什么样的函数调用是静态束定,而什么样的调用又是动态束定呢?
       (1) 一般的调用都是静态束定;而虚函数用了静态修饰符后(类名::虚函数),也成为静态束定 
       (2) 当一个类成员函数用virtual修饰后(即虚函数),此时,调它时就是动态束定
    5 而在实际情况中,怎样判断到底调用的是那个函数呢?其实很简单
       (1) 第一种情况简单,不是虚函数的,调那个函数就是那个函数.
       (2) 虚函数的,如果用了静态束定,那就是束定了的函数,如: CWinThread::OnIdle()
       (3) 虚函数的,没用了静态束定.实际上也简单: 就是类的实例实际上是那个类,调用的就是那个类的覆盖函数.如
    Class A
    {
    protected:
    virtual void test();//1
    }
    Class B : public A
    {
    protected:
    virtual void test();//2
    }B b;
    A* a = &b;
    a->test()//call B::test()6 讲到这到,相信你彻底明白了,不过有一点特殊,在构造函数中,所有的函数都是静态束定(即调用自己类里面的函数)
      

  6.   

    这是一个静态绑定,在编译时就确定了函数指针CWinThread::Run(),当然是它。
      

  7.   

    答案是,CWINAPP的ONDILE()函数
      

  8.   

    谁的对象就调用谁的函数
    例:#include <iostream.h>
    class A
    {
    public:
    virtual void f(){cout<<"A called"<<endl;}
    };
    class B:public A
    {
    public:
    virtual void f(){cout<<"B called"<<endl;}
    };
    void main()
    {
    A a;
    B b; A*pa1=&a; //调用A::f() A类对象
    A*pa2=&b; //调用B::f() 尽管是A*  但是B类对象
    B*pb=&b; //调用B::f() B类对象 pa1->f();
    pa2->f();
    pb->f();
    }
      

  9.   

    注释位置不对#include <iostream.h>
    class A
    {
    public:
    virtual void f(){cout<<"A called"<<endl;}
    };
    class B:public A
    {
    public:
    virtual void f(){cout<<"B called"<<endl;}
    };
    void main()
    {
    A a;
    B b; A*pa1=&a; 
    A*pa2=&b; 
    B*pb=&b;  pa1->f();//调用A::f() A类对象
    pa2->f();//调用B::f() 尽管是A*  但是B类对象
    pb->f(); //调用B::f() B类对象
    }