标签:c++
高效C++ --模板与泛型编程
在C++中模板体现的是编译器多态,virtual体现的是运行期多态。
关于typename的双重含义:
在声明template参数时,不论使用关键字class或typename,意义完全相同。
但是C++并不总是把class和typename视为邓建。有时候必须使用typename。
Template内出血的名称如果依于某个template参数,称之为从属名称。如果从属名称在class内呈嵌套状,我们称她为嵌套从属名称。
总而言之,在一个模板中使用了另一个模板内的参数类型,就需要使用typename表明所使用的这个变量是属于一个模板中的类型。任何时候当你想要在template中值涉一个嵌套从属类型名称,就必须在紧邻他的前一个位置放上关键字typename
使用typename表示嵌套从属类型名称;但不得在base class list(基类列)或member initialization list(成员初值列)内以它作为baseclass修饰符。
在使用new申请内存时,如果内存空间不足,可能会有异常发生,但是可以从外界设置异常发生时调用的函数,set_new_handler
区分接口继承和实现继承:
函数接口继承和函数实现继承,这两种继承的差异,很像函数声明与函数定义之间的差异。
有时候希望derived classes只继承成员函数的接口(也就是声明);有时候你又会希望derived classes同时继承函数的接口与实现,但又希望能够override他们所继承的实现;又有时候你希望derived classes同时继承函数的接口和实现,并且不允许override任何东西。
其实上面的三种情况分别对应三种情况,分别是纯虚函数,虚函数,和基类的函数
声明一个pure virtual函数的目的是为了让derived classes只继承函数接口。
声明简朴的impure virtual函数的目的,是让derived classses继承该函数的接口和缺省实现。
声明non-virtual函数的目的是为了令derived classes继承函数的接口及一份强制性实现。
模板特化的方法,对于模板的特化就像是又定义了一个模板,不过这个模板的参数是已经规定好的,所以的template里面就不需要定义typename。相当于模板的重载,只不过这个模板的参数是已经规定好了的。
Effective C++中提到过,使用const enum inline代替#define,这里的意思是前面可以替代后面,因为对于#define来说,将来替换的始终是文本。如果有错或者使用#define不是很恰当,可能在编译的时候不会出错但是在运行过程会出错,如果是使用前者来搞定这些,他们如果有错,在编译的时候是可以发现的。
目前所有编译器对于virtual function 的实现方法都是使用各个class专属的virtual table,大小固定,并且在程序执行前就构造好了。
C++在布局以及存取时间上主要的额外负担是由virtual引起的。
Virtual function机制:用以支持一个有效率的“执行期绑定”
Virtual base class用以实现“多次出现在继承体系的base class 有一个单一而被共享的实体”
这两种机制分别对应子类中的vptr vbtr子类中有两个指针,分别执行他们
还有一些多重继承下的额外负担,发生在“一个derived class和其第二或后继之base class的转换”之间。
标签:c++
原文地址:http://blog.csdn.net/yusiguyuan/article/details/41950323