目录
包含对象成员的类
实现has-a关系的途径
初始化被包含的对象
对于继承的对象,构造函数在成员初始化列表中使用类名来调用特定的基类构造函数。对于成员对象和内置类型的成员则使用成员名。
注意:初始化列表中的项目被初始化的顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序。
在包含中有显示的对象名称,可以通过对象名称来调用包含类的公有方法。
私有继承(private)
可以实现has-a关系途径——私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,所以不继承基类的接口,但是可以在派生类的成员函数使用它们。
使用私有继承,基类的公有方法将成为派生类的私有方法;使用私有继承,类将继承实现。
包含将对象作为一个命名的成员对象添加到类中,而私有继承将对象作为一个未命名的继承对象添加到类中。
在私有继承中的类定义中,省略了显示对象名称,并在内联构造函数中使用了类名,而不是成员名。
访问基类的方法
包含使用对象来调用方法;私有继承使用类名和作用域解析运算符来调用基类的方法。
访问基类对象
使用强制类型转换,将派生类对象转换为基类对象。为了避免调用构造函数创建新的对象,可以用强制类型转换来创建一个引用。
访问基类的友元函数
通过显示地转换为基类来调用正确的函数。在私有继承中,咋不进行显示类型转换的情况下,不能将指向派生类的引用或指针赋给基类引用或者指针。
保护继承
保护继承是私有继承的变体。使用关键字protected。在使用保护继承时,基类的公有成员和保护成员都变成派生类的保护成员。
特征 | 公有继承 | 保护继承 | 私有继承 |
---|---|---|---|
公有成员变成 | 派生类的公有成员 | 派生类的保护成员 | 派生类的私有成员 |
保护成员变成 | 派生类的保护成员 | 派生类的保护成员 | 派生类的私有成员 |
私有成员变成 | 只能通过基类接口访问 | 只能通过基类接口访问 | 只能通过基类接口访问 |
能否隐式向上转换 | 是 | 是(只能在派生类中) | 否 |
隐式向上转换意味着无需进行显示类型转换,就可以将基类指针或引用指向派生类对象。
注意:这里通过基类接口访问表示需要将派生类转换为基类才能访问成员。
多重继承
编译器默认不带关键字的是私有派生。
虚基类
虚基类使得从多个类(它们的基类相同)派生出的对象只继承一个基类对象。
用关键字virtual可以使得基类变为虚基类。