MST

星途 面试题库

面试题:C++中函数重载与虚函数在参数和返回值上的差异

请阐述C++函数重载和虚函数在参数列表以及返回值类型方面存在哪些不同点。并分别举例说明函数重载和虚函数是如何在参数和返回值的规则下正常工作的。
31.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

函数重载

  • 参数列表:函数重载要求函数名称相同,但参数列表(参数的个数、类型或顺序)必须不同。返回值类型可以相同也可以不同,但仅返回值类型不同不能构成函数重载。
  • 示例
#include <iostream>

// 函数重载示例
int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

int main() {
    std::cout << "整数相加: " << add(3, 5) << std::endl;
    std::cout << "浮点数相加: " << add(3.5, 5.5) << std::endl;
    return 0;
}

在上述示例中,两个add函数名称相同,但参数类型不同,这就是函数重载。编译器会根据调用时传入的参数类型来决定调用哪个函数。

虚函数

  • 参数列表:虚函数在基类和派生类中,函数原型(包括参数列表和返回值类型)必须完全相同(协变返回类型除外,即派生类虚函数返回基类虚函数返回类型的指针或引用)。
  • 示例
#include <iostream>

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;
    }
};

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

    animal1->speak();
    animal2->speak();

    delete animal1;
    delete animal2;
    return 0;
}

在上述示例中,Animal类中的speak函数是虚函数,Dog类继承自Animal并重写了speak函数。这两个函数的参数列表和返回值类型都相同。当通过基类指针调用虚函数时,实际调用的是对象真正类型(运行时类型)的虚函数版本,实现了多态性。