当前位置:首页 C++ > 正文

c++重载overload,覆盖override,重写overwrite,这三者之间的区别

作者:野牛程序员:2023-07-15 11:52:42 C++阅读 3026

在C++中,重载(overload)、覆盖(override)和重写(overwrite)是面向对象编程中的重要概念,它们之间有一些明显的区别。下面是对它们的解释:

  1. 重载(Overload): 重载指的是在同一个作用域内,使用相同的函数名,但是参数列表不同的多个函数。重载函数可以具有不同的参数类型、不同的参数个数或者不同的参数顺序。编译器通过函数的参数列表来区分这些重载函数,并根据调用时的实参类型或数量来确定调用哪个函数。重载主要用于增加函数的灵活性和可用性。

  2. 覆盖(Override): 覆盖是指在派生类中重新定义基类中的虚函数,使用相同的函数签名(函数名、参数列表和返回类型)。派生类中的虚函数覆盖了基类中的虚函数,使得在通过基类指针或引用调用虚函数时,实际调用的是派生类中的函数。覆盖用于实现多态性,让派生类能够为基类提供特定的实现。

  3. 重写(Overwrite): 重写是指在派生类中重新定义基类中的非虚函数,使用相同的函数签名(函数名、参数列表和返回类型)。与覆盖不同的是,重写的函数不是基类中的虚函数。重写会隐藏基类中的同名函数,即使通过基类指针或引用调用函数,也只会调用派生类中的函数。重写主要用于重新实现基类中的某个函数,而非实现多态性。

总结: 重载(overload)是指在同一个作用域内使用相同函数名但不同参数列表的多个函数,通过参数列表的差异来区分函数。覆盖(override)是指派生类重新定义基类中的虚函数,使用相同的函数签名,实现多态性。重写(overwrite)是指派生类重新定义基类中的非虚函数,使用相同的函数签名,隐藏基类中的同名函数。


以下是一些示例来说明它们之间的区别:

  1. 重载(Overload)的示例:

// 函数重载示例
void print(int num) {
    cout << "整数: " << num << endl;
}

void print(double num) {
    cout << "浮点数: " << num << endl;
}

int main() {
    print(10);        // 调用第一个print函数
    print(3.14);      // 调用第二个print函数
    return 0;
}

在这个例子中,print 函数被重载了两次,一次接受整数参数,一次接受浮点数参数。编译器根据传递的参数类型来决定调用哪个重载函数。

  1. 覆盖(Override)的示例:

class Animal {
public:
    virtual void makeSound() {
        cout << "动物发出声音" << endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        cout << "喵喵喵" << endl;
    }
};

int main() {
    Animal* animal = new Cat();
    animal->makeSound();   // 调用派生类Cat中覆盖的makeSound函数
    delete animal;
    return 0;
}

在这个例子中,Animal 类中的 makeSound 函数被声明为虚函数,并在派生类 Cat 中进行了覆盖。通过基类指针调用 makeSound 函数时,实际上会调用派生类 Cat 中覆盖的函数。

  1. 重写(Overwrite)的示例:

class Shape {
public:
    void draw() {
        cout << "绘制形状" << endl;
    }
};

class Circle : public Shape {
public:
    void draw() {
        cout << "绘制圆形" << endl;
    }
};

int main() {
    Circle circle;
    circle.draw();  // 调用派生类Circle中重写的draw函数
    return 0;
}

在这个例子中,Shape 类中的 draw 函数被派生类 Circle 中的同名函数重写。当调用 draw 函数时,只会调用派生类 Circle 中的函数,而不会调用基类 Shape 中的函数。

这些示例展示了重载、覆盖和重写的不同应用场景和效果。重载通过参数列表的不同来区分同名函数,覆盖在派生类中重新定义基类的虚函数,而重写是在派生类中重新定义非虚函数。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击