您的位置:首页 > 编程语言 > C语言/C++

C++笔记——c++编程思想(上)多态性、虚函数与模板

2010-03-20 20:51 295 查看
1. 每当创建一个虚函数的类,或从有虚函数的基类派生出一个子类时,编译器就为这个基类创建了一个唯一的虚函数表,在这个表中,编译器存放了这个类中及其基类声明的所有虚函数的地址,若子类虚函数对父类进行了重定义,则存子类虚函数的地址,否则存父类虚函数的地址。子类对父类中虚函数进行重定义时,不需要用virtual,只要一个函数在某处声明为Virtual,则一直为Virtual,子类不需要再声明。

2. 对于每个含有虚函数的类,新建一个对象时,需要增加一个虚指针,指向该类的虚函数表。在对象调用某个虚方法时,就通过这个指针找其函数地址。

3. 当编译器确切知道对象类型时(知道非父类引用指向子类对象),也会实现早捆绑。

4. 虚函数之所以是可选,而不像java一样全实现多态,主要是出于效率考虑。

5. 如果只想定义一个接口,交由子类具体现实,则可将函数声明为纯虚函数:virtual void f()=0;//前加Virtual后加=0

6. 有纯虚函数的类,虚函数表是不完整的。因为不会有该类对象的函数调用问题,只能由其子类对象调用。

7. 对象切片:在多态处理对象时,如果采用值传递(子类对象赋给父类对象)的方式处理函数调用参数,将会产生对象切片,即将一个子类对象真正地转换为一个父类对象,去除了所有子类的其它数据。所以多态处理函数调用时,需要用引用。使用抽象类可有效防止对象切片。

8. 派生类对虚函数重定义时,不允许改变其返回值,除非返回值为原返回值的子类对象。

9. 纯析构函数可以实现函数体,而且子类不要求实现该纯虚函数。其唯一作用是阻止对象实例化。

10. 构造函数中调用自己定义的虚函数时, 不会调用任何子类版本,因为子类对象初始化之前,父类对象必须先初始化(调用构造函数),而此时它显然不拥有子类对象的虚函数指针。因此,虚函数机制在包含该虚函数的类的构造函数中不起作用。

11. 虚析构函数也会产生虚函数表,因此若不用来多态,尽量不要声明虚虚构函数。

12. 当用户使用模板时,参数由编译器来替换。当非常像原来的宏方法,但却更易使用,更清晰。模板实现了参数化类型。模板是对源代码的重用,继承是对目标代码的重用。

13. 模板声明与定义,都放在头文件中,目前的编译器也很少支持声明与定义分开的情形,所以在一起比较通用。但是这样会无法隐藏代码,毕竟是源代码级的重用。编译器并不会为类型T分配内存,只有具体实例化一个类型实例时,才分配。

14. 模板实现迭代器,其实是用指针(T型指针)的前后移动,或下标的加减来实现的。因为模板解决了类型问题,所以迭代器实现容易许多。无非是一些current,next(),first(),last()之类的函数。

15. stack <int,100>和stack<int ,99>是两个类型。

16. 模板声明时表示类型的class可用typename代替。

17. typeid()用法示例。int i; typeid(i).name()返回类似int的串(具体视编译器)。

18. 模板函数可与一般函数互相重载,具体调用时,会调用特化程度最高的版本。

19. 代码一样,只类型不同时,用模板。代码或方法细微差别,基本相似,则用继承。

20. STL(Standard Template Library)包含三大组件,容器、算法、迭代器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: