跳到主要内容

函数重载是什么意思?它与虚函数的概念有什么区别?

参考答案:

函数重载(Function Overloading)和虚函数(Virtual Functions)是C++中两个不同的概念,它们各自有不同的用途和实现方式。

  1. 函数重载(Function Overloading)

函数重载是指在同一作用域内,可以定义多个名字相同的函数,但它们的参数列表(参数的类型、数量或顺序)必须不同。这样,编译器在调用函数时,会根据提供的参数类型和数量来决定调用哪个函数。

例如:

void print(int i) {
    std::cout << "Printing int: " << i << std::endl;
}

void print(double d) {
    std::cout << "Printing double: " << d << std::endl;
}

在上述代码中,print函数被重载了两次,一次接受int类型的参数,另一次接受double类型的参数。

  1. 虚函数(Virtual Functions)

虚函数主要用于实现多态性。当基类的指针或引用指向派生类对象时,如果通过该指针或引用调用在基类中声明为虚函数的函数,那么将调用派生类中的实现,而不是基类中的实现。这就是动态绑定或运行时多态。

例如:

class Base {
public:
    virtual void func() {
        std::cout << "Base func" << std::endl;
    }
};

class Derived : public Base {
public:
    void func() override {
        std::cout << "Derived func" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived();
    ptr->func();  // 输出 "Derived func"
    delete ptr;
    return 0;
}

在上述代码中,Base类中的func函数被声明为虚函数(使用virtual关键字),然后在Derived类中被重写(使用override关键字)。在main函数中,我们创建了一个Derived对象,但是通过Base类的指针来调用func函数。由于func函数在Base类中被声明为虚函数,所以实际调用的是Derived类中的func函数实现。

区别

  • 函数重载 是编译时多态,根据参数的类型和数量在编译时决定调用哪个函数。
  • 虚函数 是运行时多态,根据对象的实际类型在运行时决定调用哪个函数。
  • 函数重载要求函数名相同但参数列表不同,而虚函数要求基类中的函数被声明为virtual,并且可以在派生类中被重写。
  • 函数重载主要用于提供多种功能相似但参数不同的函数,而虚函数主要用于实现派生类对基类行为的扩展或修改。