"C++中的重载、覆盖与隐藏是面向对象程序设计中的核心概念,尤其是在多态性方面。多态允许不同的类对同一方法有不同的实现,从而提高代码的灵活性和可扩展性。本章主要介绍了三个关键概念:继承、虚函数和抽象类。
7.1 继承呼唤多态
继承是面向对象编程的基础特性之一,通过继承,子类可以从父类那里继承属性和行为。在C++中,`class GraduateStudent : public Student` 表示`GraduateStudent`类是从`Student`类派生的。这种关系允许`GraduateStudent`类具有`Student`类的所有成员,同时可以添加或修改自己的成员。派生类的对象可以赋值给基类对象,如`Student s = GraduateStudent gs;`,这就是所谓的赋值兼容规则。
7.2 虚函数
虚函数是实现多态的关键。在基类中声明一个虚函数,如`virtual void display()`,意味着在派生类中可以覆盖这个函数,提供不同的实现。在上面的例子中,`Student`和`GraduateStudent`都定义了`display()`函数,`GraduateStudent`的`display()`覆盖了`Student`的`display()`。当通过基类指针调用`display()`时,调用的实际函数取决于指针指向的对象类型,而非指针本身的类型。例如,`Student *ps = &gs; ps->display();`将调用`GraduateStudent`的`display()`。
7.3 纯虚函数与抽象类
纯虚函数(`virtual void func() = 0;`)定义了一个接口,但没有提供实现。包含纯虚函数的类称为抽象类,不能实例化,通常作为其他派生类的基类,确保它们必须实现纯虚函数。抽象类用于定义类族的共同接口,使得类家族具有统一的操作方式。
同化效应
在C++中,赋值操作`s = gs;`会导致`s`指向的对象(原本是`Student`对象)的行为变为`GraduateStudent`对象的行为,即`s.display()`会输出`GraduateStudent`。然而,`s`仍然是`Student`类型的,因此它只能访问`Student`类的成员,无法访问`GraduateStudent`特有的成员。这种现象称为同化效应,它也适用于指针,如`Student *pgs = &s;`,虽然`pgs`指向的是`Student`对象,但实际上它是指向`GraduateStudent`对象的,但由于类型是`Student *`,只能调用`Student`类的成员。
在实际编程中,理解这些概念非常重要,因为它们构成了C++多态性的基础,允许我们编写更加灵活和可维护的代码。通过继承、虚函数和抽象类,我们可以设计出层次结构清晰、功能丰富的类家族,有效地管理复杂系统中的各种对象。"