如果CWinThread::Run()中直接像调用OnIdle()的话,那是调用CWinAPP中的
OnIdle()。如果在CWinThread中调用CWinThread::OnIdle()的话,那是调用CWinThread的OnIdle.
OnIdle()。如果在CWinThread中调用CWinThread::OnIdle()的话,那是调用CWinThread的OnIdle.
解决方案 »
- 一个更改ico图标的问题,请高手帮忙看一下什么地方出了问题
- OnNavigateComplete2运行PPT页面提示脚本错误:
- vs2003中如何将m_pSet指向的成员变量和编辑框连接?
- vc和ado+ sql2000怎样支持汉字字段名,在线等...
- 请问error include 'stdafx.h' before including this file for PCH 是什么错误啊?
- 关于:term does not evaluate to a function
- vc++6.0 不能编译任何程序。连自带的“HELLO WORLD!“都不行!!
- 如何实现调用的程序最小化?
- 三个问题
- MFC 中不能响应OnReceive函数
- 高分相赠,——————有关于消息传递的问题,————up有分,不够再补
- 谁有最新的MSDN?
if (!PumpMessage())
return ExitInstance();
也是调用的CWinApp的ExitInstance();
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 讲到这到,相信你彻底明白了,不过有一点特殊,在构造函数中,所有的函数都是静态束定(即调用自己类里面的函数)
例:#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();
}
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类对象
}