C++中的多态性

你好,有抱负的程序猿们!今天,我们将开始一段令人激动的旅程,进入C++多态性的世界。如果这个词听起来让你感到害怕,不用担心——在本课结束时,你会像喜欢你最爱的运动鞋一样舒适地使用多态性!

C++ Polymorphism

什么是多态性?

在我们深入代码之前,先来了解一下多态性实际上意味着什么。这个词来自希腊语:“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;
}

让我们分解一下:

  1. 我们有一个基类Animal,它有一个虚函数makeSound()
  2. 我们创建了两个派生类DogCat,每个类都重写了makeSound()函数。
  3. main()中,我们创建类型为Animal*的指针,但将它们分配给DogCat的对象。
  4. 当我们调用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;
}

在这个例子中:

  1. Shape是一个抽象基类,有一个纯虚函数area()
  2. CircleRectangle是具体的类,它们继承自Shape并提供自己的area()实现。
  3. 我们可以创建Shape指针,并将它们分配给CircleRectangle对象。
  4. 当我们调用area()时,根据实际对象类型调用正确的版本。

抽象类

至少有一个纯虚函数的类称为抽象类。你不能创建抽象类的对象,但你可以使用指针和引用来引用抽象类类型。

为什么使用多态性?

  1. 灵活性:它允许你编写可以与多种类型的对象一起工作的代码。
  2. 可扩展性:你可以在不改变现有代码的情况下添加新的派生类。
  3. 简洁性:它可以通过允许你统一地处理不同的对象来简化代码。

多态性中的常见方法

以下是C++多态性中常用的方法表格:

方法 描述
virtual 在基类中声明虚函数的关键字
override 在派生类中用来指示函数重写了基类函数的关键字
= 0 用于声明纯虚函数
dynamic_cast 在多态类层次结构中用于安全向下转型的运算符
typeid 用于在运行时获取类型信息

结论

多态性是C++中的一项强大特性,它允许灵活和可扩展的代码。通过使用虚函数和纯虚函数,你可以创建可以互换使用的类层次结构,从而产生更模块化和可维护的代码。

记住,就像学习任何新技能一样,掌握多态性需要练习。如果一开始它没有立即吸引你,不要气馁——继续编码,继续实验,很快你就能像专业人士一样使用多态性!

Credits: Image by storyset