第15章 面向对象编程
-
虚函数:基类希望派生类重新定义的函数定义为virtual。除了构造函数外,任意非static成员函数都可以是虚函数(一般需要定义虚析构函数)。保留字只在类内部的成员函数声明中出现,不能用在类定义体外部出现的函数定义上。派生类型必须对想要重定义的每个继承成员进行声明,且必须与基类中的定义方式完全匹配(只有一个例外,返回对基类型的引用或指针,可以变为返回派生类型的引用或指针)。一旦函数在基类中声明为虚函数,它就一直未虚函数。
-
动态绑定:动态绑定使编译器能够在运行时决定使用基类中定义的函数还是派生类中定义的函数。要触发动态绑定,必须满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定;第二,必须通过基类类型的引用或指针进行函数调用。
-
派生类:定义派生类形式 class classname: access-label base-class
-
(派生类对基类)访问权限:public和private跟其他非继承对象一样,关键是protected。protected成员可以被派生类对象访问,但不能被该类型的普通用户访问。此外,protected还有另一重要性质:派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。
-
成员在派生类中的访问级别:是由成员在基类中的级别,和继承方式access-label共同决定的。如果要恢复在基类中的访问级别(只能是public级别),则用using base-class::(成员名)。
-
public派生类继承基类的接口;使用private或protected派生的类不继承基类的接口,这些派生通常称为实现继承。
-
-
友元关系不能继承。
-
即使析构函数没有工作要做,继承层次的根类也应该定义一个虚析构函数。
-
通过基类的引用或指针调用函数,首先在基类中找:如果函数非虚函数,则直接调用基类的该函数;如果为虚函数,则看派生类是否重新定义了虚函数,如果定义了,则调用派生类的方法。不需要管派生类是否进行了其他重载(会屏蔽基类的函数),这与通过对象调用不同。
-
纯虚函数:在函数形参表后面写上=0以指定纯虚函数。含有(或继承)一个或多个纯虚函数的类是抽象基类,不能创建抽象类型的对象。
-
容器与继承:不应该用容器保存基类类型的对象,因为这样会把派生类中多余的成员切掉,应该保存基类类型的指针(引用不能一般意义的赋值,不能保存在容器中)。指针的复制和赋值需要特别小心,句柄类就是用来存储和管理基类,以安全的进行指针的复制和赋值。
第16章 模板与泛型编程
-
泛型编程就是以独立于任何特定类型的方式编写代码。
-
模板定义:template <class T> (inline) T min(){}。要定义为内联函数,inline必须放在template后。模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参,非类型模板实参必须是编译时常量表达式。
-
模板形参不能为空。模板形参的名字不能在模板内部重用。声明必须指出函数或类是一个模板(带上template)。
-
用typename在模板定义内部指定类型:如T::Y极可能是类型也可以是数据成员,为了显式指定为类型,可以使用typename:typename T::Y。
-
类型形参的实参受限转换:类型为模板形参的那些实参转换受限,类型必须完全匹配。
-
函数模板的显式实参:当模板实参推断不能确定模板类型时,需要显式指定模板形参所用的类型或值。template <class T1, class T2, class T3) T1 sum(T2,T3);此时需要显式指定T1,long val=sum<long> (i,lng)。(显式模板实参从左到右与对应模板相匹配。) 显式实参后可以类型转换:sum<double,double,double>(intVale,floatVale)
-
标准C++为编译模板代码定义了两种模型:包含编译模型和分别编译模型。 包含编译模型:在声明模板的头文件中添加一条#include,引入包含相关定义的源文件。分别编译模型:定义模板时,在template之前包含关键字export实现。
-
在类外定义类的成员函数的开头应该是:template <class T> ret-type Queue<T>::member-name 。
-
类模板中的友元声明
-
普通友元:以非模板函数或非模板类为模板类的友元,跟普通的一样
-
一般模板友元关系:
-
template<class Type> class Bar{
template<class T> friend class Fool;//一对多的关系
template<class T> friend void function(cons T&);//一对多的关系
}
-
特定的模板友元关系
tempalte<class Type> class Bar{
friend class Fool2<Type>;
friend class Fool<char *>;
friend void function<Type>(const Type&>;
}
-
模板特化:指定一个或多个模板形参的实际类型或实际值。
-
完全特化
-
(函数)template<>
int compare<const char*>(const char* cosnt &v1,const char* const&v2)
(类)template<> class Queue<const char*,const char*>{}
-
类模板部分特化
template<class T1> class Queue<T1, const char*>