C++与多态

多态的本质是允许对象以其实际类型的行为方式来操作,而不仅仅是其静态类型所声明的方式。
多态是面向对象编程中的一种核心概念,它允许对象根据其具体类型执行相应的操作,而不是其声明的类型。我们可以使用一个经典的动物的例子来说明这一点。

应用场景:动物园模拟

假设我们正在为一个动物园模拟游戏编写代码。动物园里有各种动物,每种动物都有一个发出声音的行为,但每种动物的声音都是不同的。

不使用多态:

如果不使用多态,我们可能会这样做:

class Dog {
public:
    void makeSound() { cout << "Woof!\n"; }
};

class Cat {
public:
    void makeSound() { cout << "Meow!\n"; }
};

// 使用
Dog dog;
dog.makeSound();

Cat cat;
cat.makeSound();

如果动物园中有很多不同的动物,我们需要为每种动物单独编写代码。

override:
这是C++11引入的一个新关键字,它表示该函数意图重写基类中的一个虚函数。如果基类没有这样的虚函数或函数签名与派生类中的函数不匹配,编译器会产生一个错误。
使用override关键字是一个好的编程习惯,因为它可以帮助检测重写虚函数时可能发生的错误。例如,如果基类的函数签名发生了变化,但派生类没有被相应地更新,使用override关键字可以在编译时捕获这种错误。综上,void makeSound() const override声明了一个常成员函数makeSound,该函数重写了其基类中的一个虚函数,并且不返回任何值。在其函数体中,它使用cout输出"Meow!\n"

使用多态:

我们可以定义一个基类Animal,并为所有动物提供一个公共接口:

class Animal {
public:
    virtual void makeSound() const = 0; // 纯虚函数
};

class Dog : public Animal {
public:
    void makeSound() const override { cout << "Woof!\n"; }
};

class Cat : public Animal {
public:
    void makeSound() const override { cout << "Meow!\n"; }
};

// 使用
Animal* animals[] = {new Dog(), new Cat()};

for(int i = 0; i < 2; i++) {
    animals[i]->makeSound();
}

// 输出:
// Woof!
// Meow!

这样,如果我们想添加更多种动物,只需要继承Animal类,并重写makeSound函数。这样可以大大简化代码,提高其可扩展性。

为什么使用多态?

  1. 代码的可扩展性:只需要添加新的子类,并实现或重写其方法,而无需修改现有的代码。
  2. 代码的可维护性:使用多态可以简化代码,因为所有的动物都使用同一个接口。
  3. 代码的灵活性:我们可以动态地在运行时确定对象的实际类型,并根据实际类型执行相应的操作。

总之,多态使得我们能够编写更为灵活、可扩展和可维护的代码。

在完成相似功能时,又不想重复造轮子的话就使用多态
多态主要体现在以下几点:

  1. 代码复用:如果有很多类都有类似的功能,那么可以使用多态来实现代码复用。例如,你可以有一个接口或基类Shape,并有多个派生类如CircleRectangle等。每个派生类都有自己的实现,但他们都可以通过Shape接口进行访问。

  2. 扩展性:使用多态,如果需要添加一个新的类(例如,添加一个Triangle类),你只需要添加这个新类的实现,而不需要修改已有的代码。

  3. 灵活性:多态允许你在运行时更改对象的行为。例如,你可以根据需要在运行时切换不同的算法或策略。

  4. 解耦:多态通过提供一个接口或基类来隔离不同的实现,这有助于分离关注点,并使系统各部分之间的依赖降到最低。

所以,多态不仅仅是为了避免“重复造轮子”,而是为了编写更通用、灵活、易于扩展和维护的代码。

你可能感兴趣的:(C++,c++,开发语言)