MST

星途 面试题库

面试题:C++ 中父类虚函数如何影响代码扩展性

请解释在 C++ 中,当父类的某个函数被声明为虚函数时,对整个代码的扩展性有哪些具体影响?并通过一个简单的示例代码说明,比如包含父类、子类的继承关系,以及在不同场景下调用虚函数的情况。
42.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 对代码扩展性的具体影响
    • 多态性支持:允许在运行时根据对象的实际类型来决定调用哪个函数版本,而不是在编译时就确定。这使得代码可以更加灵活地处理不同类型的对象,提高了代码的可扩展性。例如,在一个图形绘制系统中,可以有一个父类Shape,子类CircleRectangle等继承自它。通过虚函数draw,可以在运行时根据具体的Shape类型(实际是CircleRectangle等)来调用对应的draw函数,而不需要在代码中写大量的条件判断语句。
    • 易于代码维护和扩展:当需要添加新的子类时,只需要在子类中重写虚函数,而不需要修改调用该函数的现有代码。比如在上述图形绘制系统中,如果要添加一个新的Triangle类,只需要在Triangle类中重写draw虚函数,而调用draw函数的其他代码不需要改变。
  2. 示例代码
#include <iostream>

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

// 子类1
class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Dog barks" << std::endl;
    }
};

// 子类2
class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Cat meows" << std::endl;
    }
};

// 函数接受一个Animal指针并调用makeSound函数
void hearSound(Animal* animal) {
    animal->makeSound();
}

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    hearSound(animal1);
    hearSound(animal2);

    delete animal1;
    delete animal2;

    return 0;
}

在上述代码中:

  • Animal类中的makeSound函数被声明为虚函数。
  • DogCat类继承自Animal类,并各自重写了makeSound函数。
  • hearSound函数接受一个Animal指针,并调用makeSound函数。在main函数中,分别创建了DogCat对象,并通过Animal指针传递给hearSound函数,运行时会根据对象的实际类型(DogCat)调用相应的makeSound函数版本,体现了虚函数带来的多态性,使得代码具有更好的扩展性。