以下是main函数最开始的两段,也是cocos2d一开始执行的地方:
AppDelegate app; return Application::getInstance()->run();
接下来用代码对以上函数进行简单复原:
#include<iostream> #include<assert.h> using namespace std; class AbstractBase { public: virtual void denglu() = 0; virtual void houtai() = 0; virtual void tuichu() = 0; }; class Application :public AbstractBase { public: Application() { sm = this; } bool run() { denglu(); return true; } static Application* GetInStance() { assert(sm); return sm; } static Application* sm; }; Application* Application::sm = NULL; class AppDelegate :private Application { public: void denglu() override { cout << "登录" << endl; } void houtai() override { cout << "后台运行" << endl; } void tuichu() { cout << "退出" << endl; } }; int main(int argc,char* argv[]) { AppDelegate app; Application::GetInStance()->run();
//return Application::GetInStance()->run();直接return在vs下会闪退,所以为了观察效果,去掉了return
getchar(); return 0; }
输出:
可能会产生疑问,为什么不直接在Application中进行函数的复写,而是要单独拿出来,原因就是坚持对修改关闭,对扩展开放的原则,Application其实作用很大,跨平台相关的工作都是由他来进行的。
接下里对以上代码进行小结:
AppDelegate相当于子类,而Application::GetInstance会得到AppLication的指针。
又因为Application是AppDelegate的父类,所以最后一步就是父类指针调用子类覆写的虚函数,
但是这里不是直接调用的,而是通过run函数间接的调用,因为在run函数内部还会执行其他一些重要的功能.
AppDelegate app;这一步首先会创建Application的构造函数,然后才是AppDelegate的构造函数,也就是AppDelegate 对象包含了Application对象,如果在Application的构造函数中写入cout<<this<<endl; 在main函数中写cout<<&app<<endl;地址是相同的。所以
Application::GetInstance这一步的执行才会正确,这是关键所在.