C++面向对象程序设计:派生类与多态

需积分: 49 2 下载量 39 浏览量 更新于2024-07-14 收藏 1.95MB PPT 举报
"C++面向对象程序设计中的多态特性,特别是派生类与基类之间的名字查找过程和成员访问规则。" 在C++的面向对象编程中,多态(Polymorphism)是一个核心概念,它允许我们使用一个基类类型的指针或引用操作不同派生类的对象,实现一种统一的接口。这一特性在处理类的继承关系时非常有用,尤其是当类家族中有同名成员时。 **派生类的名字查找过程**遵循以下规则: 1. **优先在派生类中查找**:当我们在派生类中使用一个成员名字时,编译器首先会在派生类的范围内查找这个名字。如果找到,就直接使用派生类中的成员。 2. **沿着继承链向上查找**:如果在派生类中没有找到,编译器会接着在直接基类中查找。这个过程会一直持续,沿着基类的继承链向上,直到找到定义或者到达最基础的基类。 **隐藏与访问基类同名成员**:如果派生类和基类中有同名的成员,派生类的成员会隐藏基类的成员,也就是说在派生类的上下文中,直接使用这个名字将默认访问派生类的成员。要访问基类中的同名成员,我们需要使用作用域解析运算符`::`,例如`base_class::member`。 **赋值兼容规则**:派生类的对象可以赋值给基类对象,这被称为赋值兼容。这意味着一个基类指针或引用可以指向派生类的对象,但只能访问基类部分的成员。这种机制使得我们可以用基类的指针或引用来处理各种不同类型的派生类对象,从而实现多态。 **同化效应**:当一个派生类对象被赋值给基类对象后,虽然指针或引用类型变成了基类类型,但实际指向的对象仍然是派生类的对象。如果调用成员函数,会调用派生类中的版本,而不是基类的。这就是所谓的“同化效应”。例如,`s=gs;`之后,`s.display();`实际上会调用`GraduateStudent`的`display()`函数,即使`s`现在看起来像是一个`Student`对象。 **虚函数**:在C++中,通过声明基类的成员函数为虚函数(`virtual`),可以实现在运行时确定调用哪个类的成员函数,这是实现多态的关键。例如,`void display() virtual`。这样,即使基类指针或引用指向派生类对象,调用`display()`时也会根据实际对象的类型调用对应的函数。 **纯虚函数与抽象类**:纯虚函数(`virtual void func() = 0;`)定义了一个接口,但没有提供实现。包含纯虚函数的类被称为抽象类,不能实例化,但可以作为其他类的基类。派生类必须重写纯虚函数,提供具体实现,这样才能创建实例。 总结来说,C++的多态特性通过继承、虚函数和赋值兼容规则,实现了在运行时动态绑定,使得代码更加灵活,能够处理不同类型的对象。理解并熟练运用这些概念,对于编写高效、可扩展的C++程序至关重要。