C++教程:理解与实践多态与继承的关键技术

需积分: 3 3 下载量 116 浏览量 更新于2024-08-24 收藏 132KB PPT 举报
在C++程序设计教程(第二版)第十二章“多态”中,作者探讨了面向对象编程中的一个重要概念——继承和多态性。章节内容围绕以下几个关键知识点展开: 1. **继承与多态的召唤**: - 继承是一种将一个类(子类)从另一个类(基类)继承特性的方式,形成一种层次结构。在代码示例中,`Student` 类是 `GraduateStudent` 的祖先,通过继承关系,`Student` 类可以访问和使用 `GraduateStudent` 的属性和方法。然而,这种关系并非对称的,即 `Student` 不一定是 `GraduateStudent` 的一种,反之则不然。 2. **子类对象赋值给父类对象**: - 当我们将一个子类对象赋值给父类类型的变量时,虽然语法上允许,但会导致子类对象的实例化被替换为父类的引用,子类特有的性质丢失。例如,`Student s = gs;` 这行代码会将 `gs` 的信息隐式转换为 `Student` 类型,使得 `gs` 对象不再保留其研究生的身份。 3. **动态类型转换(Casts)**: - 使用 `static_cast` 进行类型转换是确保正确地在不同类型的对象间传递职责的关键。如 `pS = static_cast<Student*>(&gs);` 是正确的,因为指向 `Student` 的指针可以指向 `GraduateStudent` 对象。然而,尝试反过来转换 `pGS = static_cast<GraduateStudent*>(&s);` 将会失败,因为 `s` 实际上是 `Student` 类型,无法隐式升级到 `GraduateStudent` 类型。 4. **多态性实现**: - 多态性允许同一个函数调用在不同类型的对象上有不同的行为。在示例中,`void display()` 方法在 `Student` 和 `GraduateStudent` 类中实现了不同的功能,显示不同的身份。当分别调用 `ds.display()` 和 `gs.display()` 时,输出结果反映了各自对象的真实类型。 5. **同化效应(Substitution Principle)**: - 在多态的上下文中,如果一个 `Student` 类型的对象被赋值了一个 `GraduateStudent` 对象,那么对 `s` 执行 `display()` 方法仍然会输出 `UnderGraduate`,因为 `s` 保持了 `Student` 类型,即使它实际包含了更多的信息。 本节内容深入讨论了C++中继承、多态、类型转换及其在实际编程中的应用,强调了在处理子类对象和父类引用时要遵循类型特性和多态原则,以确保程序的正确性和灵活性。