面向对象程序设计-多态.ppt
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
面向对象程序设计中的多态性是编程中一个关键的概念,它允许同一种操作对不同的对象产生不同的效果。在运行时,程序可以根据对象的实际类型来决定调用哪个版本的方法,这称为动态绑定或迟后联编。多态性使得代码更加灵活,能够适应未来可能的变化,比如增加新的类或功能。 在C++中,实现多态性主要依靠虚函数(virtual function)。虚函数在基类中被声明,并且可以在派生类中被重写(override),以便在派生类对象中提供不同的实现。例如,假设有一个基类`A`和一个派生类`B`,两者都定义了名为`foo`的函数: ```cpp class A { public: virtual void foo() { cout << "This is A." << endl; } }; class B : public A { public: void foo() { cout << "This is B." << endl; } }; ``` 在`main`函数中,我们可以创建一个`B`类的对象,然后用指向`A`的指针来调用`foo`,这样就会调用`B`类的`foo`实现,而不是`A`类的: ```cpp int main() { A *pa = new B(); pa->foo(); // 输出 "This is B." return 0; } ``` 多态的应用场景很广泛,例如在影片出租店的例子中,我们需要计算不同类型的影片(VCD, DVD, 可能还有BD)的租金。通过定义一个基类`Disk`,并让不同类型的影片类继承自这个基类,每个影片类可以重写`calcRent`函数来计算各自的租金。这样,我们就可以通过一个通用的接口来处理所有类型的影片,无需关心具体是哪种类型的影片: ```cpp class Disk { public: virtual void calcRent(int days) = 0; }; class DVD : public Disk { public: void calcRent(int days) { int cost = days * 3; cout << "该DVD的租期为 " << days << " 天,租金是: " << cost << " 元。" << endl; } }; // ... Disk &disk = dvd; calcRent(disk, 5); ``` 为了实现多态,必须满足以下条件: 1. 建立一个继承体系。 2. 基类的成员函数需要使用`virtual`关键字声明为虚函数。 3. 子类重写(override)父类的虚函数。 4. 使用基类指针或引用调用函数。 虚函数的一个重要作用是使得编译器在对象创建时为类添加一个虚函数表(vtable),每个虚函数的地址都会存入这个表中。当通过指针或引用调用虚函数时,会根据指针所指向的对象的vtable找到实际应该调用的函数。如果没有`virtual`关键字,函数调用将在编译时确定,而不是运行时,这被称为静态绑定。 使用指针或引用调用虚函数的原因在于,对象一旦创建,其vtable也就确定了,而指针或引用可以指向不同类型的对象,因此调用的虚函数也会相应地改变。如果直接通过对象调用,由于对象的类型在编译时已经确定,因此调用的函数也是固定的。 多态性是面向对象编程的核心特性之一,它使得代码更具扩展性和可维护性,能够有效地应对复杂的软件需求变化。通过理解并掌握虚函数和迟后联编,开发者可以编写出更高效、更具灵活性的程序。
剩余15页未读,继续阅读
- 粉丝: 195
- 资源: 3万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助