欢迎访问宙启技术站
智能推送

函数重载和重写的区别以及如何使用

发布时间:2023-07-04 15:12:50

函数重载(Function Overloading)和函数重写(Function Overriding)是面向对象语言中的两个重要概念。它们的区别在于作用对象和实现方式。

函数重载是指在同一个类中定义多个函数,它们具有相同的名称但参数列表不同。通过对不同的参数类型或参数个数进行识别,编译器可以根据函数调用的具体情况选择合适的函数进行调用。函数重载可以增加函数的灵活性和可读性,提高了代码的复用性。

函数重载的使用可以通过下面的示例来说明:

class Calculator {
public:
    int add(int a, int b) {
        return a + b;
    }
    double add(double a, double b) {
        return a + b;
    }
};

int main() {
    Calculator calculator;
    int result1 = calculator.add(1, 2); // 调用 int add(int a, int b)
    double result2 = calculator.add(1.0, 2.0); // 调用 double add(double a, double b)
    
    return 0;
}

在上述示例中,Calculator 类中定义了两个名为 add 的函数,分别接受参数为 int 类型和 double 类型。在 main 函数中,我们可以根据实际需要选择调用合适的函数。编译器会根据参数类型选择合适的函数进行调用。

函数重载的特点是函数名相同但参数列表不同,返回值可以相同也可以不同。

函数重写是指在继承关系中,子类重新定义(覆盖)了继承自父类的同名函数。函数重写通过在子类中定义与父类函数相同的函数名和参数列表,实现了对父类函数的重新定义。在函数重写中,父类的同名函数在子类中失效,只有子类重写的函数会被调用。

函数重写的使用可以通过下面的示例来说明:

class Animal {
public:
    virtual void sound() {
        cout << "Animal makes sound" << endl;
    }
};

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

int main() {
    Animal* animal = new Dog(); // 创建父类指针指向子类对象
    animal->sound(); // 调用子类重写的 sound 函数
    
    delete animal;
    return 0;
}

在上述示例中,Animal 类中定义了一个虚函数 sound,并在 Dog 类中进行了重写。在 main 函数中,我们通过创建一个父类指针指向子类对象,并通过该指针调用 sound 函数。由于 sound 函数在动态绑定时会根据指针所指对象的实际类型进行调用,所以会调用子类重写的 sound 函数。

函数重写的特点是函数名和参数列表与父类相同,必须使用 virtual 关键字进行声明,可以有不同的函数体。