面试题:什么是多态?简单介绍下 C++ 的多态?

多态(Polymorphism)是面向对象编程(OOP)的核心概念之一,它允许不同的对象对同一消息作出不同的响应。在 C++ 中,多态主要通过虚函数(Virtual Function)和继承机制实现。


1. 多态的基本概念

  • 定义:多态是指同一操作作用于不同的对象时,可以有不同的解释和执行结果。
  • 分类
    • 编译时多态(静态多态):通过函数重载和运算符重载实现,在编译时确定调用哪个函数。
    • 运行时多态(动态多态):通过虚函数和继承实现,在运行时确定调用哪个函数。

2. C++ 中的多态

(1)编译时多态

  • 函数重载:在同一作用域内定义多个同名函数,但参数列表不同。
  void print(int i) {
      std::cout << "Integer: " << i << std::endl;
  }

  void print(double d) {
      std::cout << "Double: " << d << std::endl;
  }
  • 运算符重载:通过重载运算符实现自定义类型的操作。
  class Complex {
  public:
      Complex operator+(const Complex& other) {
          return Complex(real + other.real, imag + other.imag);
      }
  };

(2)运行时多态

  • 虚函数:在基类中声明虚函数,并在派生类中重写该函数。
  • 基类指针或引用:通过基类指针或引用调用虚函数时,实际调用的是派生类的实现。
示例:
class Animal {
public:
    virtual void speak() {
        std::cout << "Animal speaks" << std::endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {
        std::cout << "Dog barks" << std::endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        std::cout << "Cat meows" << std::endl;
    }
};

int main() {
    Animal* animals[] = {new Dog(), new Cat()};
    for (auto animal : animals) {
        animal->speak(); // 动态绑定,调用派生类的实现
    }
    return 0;
}

输出

Dog barks
Cat meows

3. 多态的实现原理

  • 虚表(vtable):每个包含虚函数的类都有一个虚表,存储虚函数的地址。
  • 虚表指针(vptr):每个对象包含一个指向虚表的指针。
  • 动态绑定:通过基类指针或引用调用虚函数时,通过虚表指针查找虚表,调用正确的函数实现。

4. 多态的优点

  • 代码复用:通过基类定义通用接口,派生类实现具体行为。
  • 扩展性:可以轻松添加新的派生类,而无需修改现有代码。
  • 灵活性:通过基类指针或引用操作派生类对象,提高代码的灵活性。

5. 总结

  • 多态:允许不同的对象对同一消息作出不同的响应。
  • C++ 中的多态
    • 编译时多态:通过函数重载和运算符重载实现。
    • 运行时多态:通过虚函数和继承实现。
  • 实现原理:依赖于虚表(vtable)和虚表指针(vptr)。
  • 优点:提高代码的复用性、扩展性和灵活性。

通过合理使用多态,可以设计出更灵活、可扩展的面向对象程序。

THE END
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容