第十九课:多态和虚函数
学习目标:
- 理解多态在C++中的含义。
- 学会使用虚函数实现运行时多态。
- 掌握虚函数、纯虚函数和抽象类的区别和用法。
- 熟悉多态在程序设计中的应用。
学习内容:
-
多态的概念:
多态是面向对象编程中的一个核心概念,它指的是调用对象的方法时能根据对象的实际类型来执行不同的函数,这种能力被称为多态性。 -
虚函数:
在C++中,通过在基类中声明函数为virtual
来实现多态。派生类可以覆盖这些虚函数来提供特定的功能。代码示例:
// 基类Shape class Shape { public: virtual void draw() { cout << "Drawing a shape." << endl; } virtual ~Shape() // 虚析构函数确保正确释放资源 }; // 派生类Circle class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } };
-
纯虚函数和抽象类:
当你在基类中声明一个虚函数但不提供实现,只是将其等于0,那么这个函数就是纯虚函数,含有纯虚函数的类是抽象类。代码示例:
class Shape { public: virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } };
-
多态的使用场景:
当你有多种类型的对象,并且希望通过一个统一的接口来操作它们时,多态特别有用。这样可以编写出更通用、易于管理和扩展的代码。
练习题:
定义一个基类Animal
并声明一个纯虚函数makeSound
。定义两个派生类:Dog
和Cat
,并实现它们各自版本的makeSound
函数。创建Animal
指针数组,用不同的动物类型来初始化,并循环通过这些指针调用makeSound
函数。
答案:
#include <iostream>
#include <vector>
using namespace std;
// 基类Animal
class Animal {
public:
virtual void makeSound() const = 0; // 纯虚函数
virtual ~Animal() // 虚析构函数
};
// 派生类Dog
class Dog : public Animal {
public:
void makeSound() const override {
cout << "Woof!" << endl;
}
};
// 派生类Cat
class Cat : public Animal {
public:
void makeSound() const override {
cout << "Meow!" << endl;
}
};
int main() {
vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
for (const auto& animal : animals) {
animal->makeSound();
}
// 释放资源
for (auto& animal : animals) {
delete animal;
}
return 0;
}
预计输出效果:
Woof!
Meow!
在这个练习中,即使Animal
类型的指针指向不同的派生类对象,通过使用虚函数,我们也能调用到正确的makeSound
函数。这就是多态的魅力所在,它允许我们写出更通用和可扩展的代码。