23"); author.printDOB(); return0; } 在面向对象编程中,C++支持两种主要的类间关系:合成(Composition)和继承(Inheritance)。这两种机制都是为了实现代码的重用和封装,使得软件设计更加模块化和易于维护。
### 6.1 合成与继承
**合成(Composition)** 是一种“has-a”关系,意味着一个类可以包含另一个类的对象作为其成员变量。在上述例子中,`Person`类包含了`Date`类的对象`dob`和`dod`,表示一个人具有出生日期(DOB)和死亡日期(DOD)。通过这种方式,`Person`类能够利用`Date`类的功能,如设置和打印日期,而无需在`Person`类中重复这些代码。
**继承(Inheritance)** 是一种“is-a”关系,一个类(子类或派生类)继承自另一个类(父类或基类),从而获取父类的属性和方法。继承允许子类复用父类的代码并进行扩展,实现代码的层次结构。C++支持两种类型的继承:单继承和多继承。
### 6.2 单继承
在单继承中,一个派生类只有一个父类。这种继承方式可以清晰地表达类之间的层次关系,并有助于减少代码的复杂性。例如,可以创建一个`Employee`类作为所有员工的基础,然后根据员工的不同角色,如`Manager`或`Salesman`,分别创建派生类,它们都继承自`Employee`。每个派生类可以添加特定于其角色的额外属性和行为。
```cpp
class Employee {
// 基类 Employee 的属性和方法
};
class Manager : public Employee {
// 派生类 Manager 的属性和方法
};
class Salesman : public Employee {
// 派生类 Salesman 的属性和方法
};
```
### 6.3 多继承
多继承是指一个派生类可以从多个父类继承。在C++中,这允许一个类结合多个父类的特性。然而,多继承可能导致一些问题,如菱形问题(Diamond Problem),这是由于多个基类中有共同的祖先导致的成员冲突。C++通过虚继承(virtual inheritance)来解决这个问题,确保只继承一份共同的祖先的实例。
```cpp
class Base {
// 共同基类 Base 的属性和方法
};
class LeftBase : public Base {
// 左侧基类 LeftBase 的属性和方法
};
class RightBase : public Base {
// 右侧基类 RightBase 的属性和方法
};
class Derived : public LeftBase, public RightBase {
// 派生类 Derived 的属性和方法
};
```
在这个例子中,`Derived`类同时继承了`LeftBase`和`RightBase`,它们都继承了`Base`。如果不使用虚继承,`Derived`类可能会有两个`Base`的副本,造成内存浪费和可能的二义性。通过声明`Base`为虚基类,可以确保只有一个`Base`实例被继承。
C++的继承机制提供了强大的代码复用和类的扩展能力。通过选择适当的继承类型(单继承或多继承),开发者可以根据需求构建灵活、可扩展的类层次结构。同时,合成和继承的结合使用能够进一步提升代码的组织和效率。