1. 建立has-a关系:
(1)组合(包含),即创建一个包含其他类对象的类。
注意:使用公有继承时,类可以继承接口和实现;使用组合,类可以获得实现但不能获得接口,接口虽然不是共有的,但可以在类方法中使用它。
(2)私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员,这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。使用私有继承时,只能在派生类的方法中使用基类的方法。私有继承通过强制类型转换使用基类对象本身。
(3)保护继承,此时基类的公有成员和保护成员都将成为派生类的保护成员。
总结:应使用包含来建立has-a关系,如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有继承。
2. 包含将对象作为一个命名的成员对象添加到类中,而私有继承讲对象作为一个未被命名的继承对象添加到类中;包含使用成员名标识构造函数;私有继承使用类名标识构造函数;使用包含时使用对象名调用方法;使用私有继承时将使用类名和作用域解析运算符调用方法。
3. 在私有继承中,未进行显示类型转换的派生类引用或指针,无法赋值给基类的引用或指针。
4. 虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
5. C++在基类是虚的时候,禁止信息通过中间类自动传递给基类,需要显式地调用所需的基类构造函数。对于虚基类必须这样做,但对于非虚基类则是非法的。
6. 不能将模板成员函数放在独立的实现文件中。
7. 类模板可以为类型参数提供默认值。
8. 模板的具体化:
(1) 隐式实例化:它们声明一个或多个对象,指出所需类型,而编译器使用通用模板提供的处方生成具体的类定义,编译器在需要对象之前,不会生成类的隐式实例化。
(2) 显示实例化:使用关键字template并指出所需类型来声明类,编译器将生成类的显示实例化。
(3) 显式具体化:格式:template<> class Classname<specialized-type-name> {…}
(4) 部分具体化
9. 模板的友元:
(1) 非模板友元:将成为模板所有实例化的友元,它使用一个模板做参数,意味着必须要为使用的友元定义显示实例化。
(2) 约束模板友元:需要在类定义的前面声明每个模板函数,然后在函数中再次将模板声明为友元,第三需要为友元提供模板定义。
(3) 非约束模板友元函数:通过在类内声明模板来创建。