MST

星途 面试题库

面试题:C++中虚函数多态实现的基础概念

请解释在C++中,如何通过虚函数和指针或引用实现多态?举例说明一个简单的基类和派生类结构,展示虚函数的多态调用。
25.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 多态的概念及实现原理
    • 在C++中,多态通过虚函数和指针或引用实现。当使用基类指针或引用指向派生类对象时,根据对象的实际类型(运行时类型)来决定调用哪个类的虚函数,而不是根据指针或引用的静态类型(编译时类型)。这使得代码可以根据对象的实际类型来执行不同的行为,实现多态性。
  2. 简单的基类和派生类结构示例
#include <iostream>

// 基类
class Animal {
public:
    // 虚函数
    virtual void speak() const {
        std::cout << "Animal makes a sound." << std::endl;
    }
};

// 派生类
class Dog : public Animal {
public:
    // 重写基类的虚函数
    void speak() const override {
        std::cout << "Dog barks." << std::endl;
    }
};

// 派生类
class Cat : public Animal {
public:
    // 重写基类的虚函数
    void speak() const override {
        std::cout << "Cat meows." << std::endl;
    }
};

int main() {
    // 基类指针
    Animal* animalPtr;

    // 创建Dog对象并让基类指针指向它
    Dog dog;
    animalPtr = &dog;
    animalPtr->speak();

    // 创建Cat对象并让基类指针指向它
    Cat cat;
    animalPtr = &cat;
    animalPtr->speak();

    return 0;
}

在上述代码中:

  • Animal类是基类,其中的speak函数被声明为虚函数。
  • DogCat类是从Animal类派生而来,并且重写了speak函数。
  • main函数中,通过Animal类型的指针animalPtr,分别指向DogCat对象,并调用speak函数。由于speak是虚函数,实际调用的是对象实际类型(DogCat)的speak函数,从而实现了多态。同样,使用基类引用也可以达到类似的效果,例如:
int main() {
    Dog dog;
    Animal& animalRef = dog;
    animalRef.speak();

    Cat cat;
    animalRef = cat;
    animalRef.speak();

    return 0;
}

这里通过Animal类型的引用animalRef,根据绑定对象的实际类型(DogCat)调用相应的speak函数,也体现了多态性。