C++中的多态性
你好,有抱负的程序猿们!今天,我们将开始一段令人激动的旅程,进入C++多态性的世界。如果这个词听起来让你感到害怕,不用担心——在本课结束时,你会像喜欢你最爱的运动鞋一样舒适地使用多态性!
什么是多态性?
在我们深入代码之前,先来了解一下多态性实际上意味着什么。这个词来自希腊语:“poly”意味着许多,“morph”意味着形式。在编程中,多态性允许不同类型的对象被视为一个公共基类型的对象。这就像有一个通用遥控器可以控制各种设备——非常酷,对吧?
现实世界类比
想象一下你在动物园。你看到不同的动物——狮子、大象、企鹅。它们都是动物,但行为却不同。当喂食时间到了,动物园管理员不需要知道每一只具体是什么类型的动物。他们只需要发出一个一般的“吃”命令,每一只动物都会以自己的方式回应。这就是多态性的实际应用!
虚函数
现在,让我们深入了解C++多态性的细节,从虚函数开始。
什么是虚函数?
虚函数是C++中的特殊函数,它允许程序在运行时根据所引用的对象的类型来决定调用哪个函数,而不是根据指针或引用的类型。
这里有一个简单的例子:
#include <iostream>
using namespace std;
class Animal {
public:
virtual void makeSound() {
cout << "动物发出声音" << endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
cout << "狗吠:汪汪!" << endl;
}
};
class Cat : public Animal {
public:
void makeSound() override {
cout << "猫叫:喵喵!" << endl;
}
};
int main() {
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->makeSound(); // 输出:狗吠:汪汪!
animal2->makeSound(); // 输出:猫叫:喵喵!
delete animal1;
delete animal2;
return 0;
}
让我们分解一下:
- 我们有一个基类
Animal
,它有一个虚函数makeSound()
。 - 我们创建了两个派生类
Dog
和Cat
,每个类都重写了makeSound()
函数。 - 在
main()
中,我们创建类型为Animal*
的指针,但将它们分配给Dog
和Cat
的对象。 - 当我们调用
makeSound()
时,程序知道根据实际对象类型调用正确的版本,而不是指针类型。
这就是虚函数和多态性的魔力!
'virtual'关键字
virtual
关键字在这里至关重要。它告诉编译器这个函数可能在派生类中被重写。如果没有它,程序将始终调用基类版本的函数。
纯虚函数
现在,让我们进一步提高层次,谈谈纯虚函数。
什么是纯虚函数?
纯虚函数是在基类中没有实现的虚函数。它通过将0赋值给函数声明来声明。
这里有一个例子:
#include <iostream>
using namespace std;
class Shape {
public:
virtual double area() = 0; // 纯虚函数
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return 3.14159 * radius * radius;
}
};
class Rectangle : public Shape {
private:
double length, width;
public:
Rectangle(double l, double w) : length(l), width(w) {}
double area() override {
return length * width;
}
};
int main() {
Shape* shape1 = new Circle(5);
Shape* shape2 = new Rectangle(4, 5);
cout << "圆形面积:" << shape1->area() << endl;
cout << "矩形面积:" << shape2->area() << endl;
delete shape1;
delete shape2;
return 0;
}
在这个例子中:
-
Shape
是一个抽象基类,有一个纯虚函数area()
。 -
Circle
和Rectangle
是具体的类,它们继承自Shape
并提供自己的area()
实现。 - 我们可以创建
Shape
指针,并将它们分配给Circle
和Rectangle
对象。 - 当我们调用
area()
时,根据实际对象类型调用正确的版本。
抽象类
至少有一个纯虚函数的类称为抽象类。你不能创建抽象类的对象,但你可以使用指针和引用来引用抽象类类型。
为什么使用多态性?
- 灵活性:它允许你编写可以与多种类型的对象一起工作的代码。
- 可扩展性:你可以在不改变现有代码的情况下添加新的派生类。
- 简洁性:它可以通过允许你统一地处理不同的对象来简化代码。
多态性中的常见方法
以下是C++多态性中常用的方法表格:
方法 | 描述 |
---|---|
virtual |
在基类中声明虚函数的关键字 |
override |
在派生类中用来指示函数重写了基类函数的关键字 |
= 0 |
用于声明纯虚函数 |
dynamic_cast |
在多态类层次结构中用于安全向下转型的运算符 |
typeid |
用于在运行时获取类型信息 |
结论
多态性是C++中的一项强大特性,它允许灵活和可扩展的代码。通过使用虚函数和纯虚函数,你可以创建可以互换使用的类层次结构,从而产生更模块化和可维护的代码。
记住,就像学习任何新技能一样,掌握多态性需要练习。如果一开始它没有立即吸引你,不要气馁——继续编码,继续实验,很快你就能像专业人士一样使用多态性!
Credits: Image by storyset