"C++面向对象程序设计中的多态特性主要通过虚函数和抽象类实现,使得基类指针能够指向派生类对象并调用相应的成员函数。"
在C++中,多态(Polymorphism)是面向对象编程的重要概念之一,它允许我们使用一个基类类型的指针或引用来操作不同派生类的对象,从而实现一种通用的编程方式。标题和描述中提到的“一个简单规则”是多态的核心思想:指向基类的指针可以指向派生类的对象,但是通过该指针只能访问基类中定义的成员。
**7.1 继承呼唤多态**
继承是实现多态的基础,它允许派生类继承基类的属性和方法。在C++中,使用`public`关键字声明继承,如`class GraduateStudent : public Student`,表明`GraduateStudent`是`Student`的派生类,继承了`Student`的所有公有成员。
**7.2 虚函数**
虚函数(Virtual Function)是实现动态多态的关键。基类中声明虚函数,如`virtual void display()`,使得派生类可以重写这个函数,提供自己的实现。当基类指针或引用调用虚函数时,实际执行的是指向对象所属类的版本。例如,在`Student`和`GraduateStudent`的例子中,`display()`函数在`GraduateStudent`中被重写,通过基类指针调用时,会显示研究生的信息,实现了多态性。
```cpp
class Student {
public:
virtual void display() { cout << "Student\n"; }
};
class GraduateStudent : public Student {
public:
void display() override { cout << "GraduateStudent\n"; }
};
```
**7.3 纯虚函数与抽象类**
纯虚函数(Pure Virtual Function)是在基类中声明但没有实现的虚函数,用`= 0`表示,如`virtual void foo() = 0;`。含有纯虚函数的类被称为抽象类,不能实例化。抽象类通常作为接口类使用,强制派生类必须实现纯虚函数,确保多态性。
**同化效应**
当一个派生类对象赋值给基类对象时,如`s = gs;`,派生类的特定信息会被“同化”,即丢失。之后,通过基类指针或引用调用成员函数时,只会调用基类的版本,即使原始对象是派生类类型。这种现象也会影响到指针,如`Student* ps = &gs;`,调用`ps->display();`时,会显示"Student",而不是"GraduateStudent"。
**总结**
多态提供了代码的通用性和灵活性,使得程序设计更加面向对象,易于扩展。基类指针和引用能指向派生类对象,通过虚函数实现动态绑定,调用相应类的成员函数。理解并熟练应用多态,可以编写出高效、可维护的C++程序。在实际编程中,应根据需求合理利用多态特性,以提高代码的复用性和可扩展性。