虚函数与多态:如果以一个基类指针指向派生类指针(强制转换),那么只能调用基类定义的函数而不能调用派生类函数。这点还是比较容易理解的(然而虚函数却是反其道)。“如果基类和派生类定义了相同名字的函数,到底调用哪个函数,必须视原始指针类型而定,与实际所指对象类型无关”。
多态,靠虚函数来完成。
什么是虚函数?如果打算在派生类中重新定义某个函数,应该在基类中把此函数声明为 virtual 。MFC中两个非常重要的虚函数:Document 的 Serialize 和 View 的 OnDraw ,这两个类应该在程序中被重新定义。
C++提供了纯虚函数:virtual void fun() = 0 ; 如果基类不打算调用它,定义为纯虚函数,不定义其实际操作,只为让其在派生类中被重新定义。拥有纯虚函数的类为抽象类,不能被实例化,即不能产生一个对象。但可以用有抽象类的指针,以便于操作其各个派生类。派生类如果不定义虚函数,那么此派生类也是一个抽象类。
为什么虚函数可以做到动态绑定(后期绑定)?每一个“内含虚函数的类”,编译器为它做出一个虚函数表,表中每一项指向一个虚函数的地址,另外加上一个指向该虚函数表的指针(常被称为 vptr)的成员变量。派生类会继承基类的虚函数表,当派生类重写基类的虚函数,表中元素所指的是派生类的重写的函数地址,不再是基类的函数地址。
四种不同的对象生存方式:in stack,in heap,global,local static:::
void fun() { CFoo foo; } // 在堆栈中产生
void fun() { CFoo *foo;} // 在堆中产生
CFoo foo; // 函数外产生一个全局对象,也必然是一个静态对象。此种情况的构造函数由编译器提供的 StartUP代码完成。
void fun() { static CFoo foo; } // 产生一个局部静态对象,产生在固定内存中
唔,第一部分的第二章就这样结束了。。。可能我的笔记大部分都是从书中直接摘录。但我想这并不防碍我的学习,也许因为是我的理解同书中所说一样。只是作者帮我表达了出来,HOHO