• C++函数重载和函数重写的区别,请举例说明


    C++中的函数重载(function overloading)和函数重写(function overriding)是两种不同的概念,它们用于不同的编程场景,有着不同的特点。

    函数重载(Function Overloading)

    函数重载是指在同一个类或命名空间中定义多个具有相同名称但参数列表不同的函数。编译器根据函数的参数类型、数量或顺序来选择调用合适的重载函数。

    1. class Calculator {
    2. public:
    3. int add(int a, int b) {
    4. return a + b;
    5. }
    6. double add(double a, double b) {
    7. return a + b;
    8. }
    9. };

    在上面的示例中,Calculator类中有两个名为add的函数,一个接受两个整数参数,另一个接受两个双精度浮点数参数。这两个函数都有相同的名称但不同的参数列表,这就是函数重载。

    函数重写(Function Overriding)

      函数重写是指在子类中重新定义父类中已经存在的虚函数(通过关键字virtual声明的函数)。重写函数的名称、参数列表和返回类型都必须与父类中的虚函数完全匹配。函数重写实现了多态性,允许在运行时根据对象的实际类型来调用合适的函数

    1. class Shape {
    2. public:
    3. virtual void draw() {
    4. // 基类中的虚函数
    5. std::cout << "Drawing a shape." << std::endl;
    6. }
    7. };
    8. class Circle : public Shape {
    9. public:
    10. void draw() override {
    11. // 子类中的重写虚函数
    12. std::cout << "Drawing a circle." << std::endl;
    13. }
    14. };

     在上面的示例中,Shape类中定义了一个虚函数draw,而Circle类继承自Shape类并重写了draw函数。当通过ShapeCircle对象调用draw函数时,将根据对象的实际类型调用合适的函数。

    总结:

    • 函数重载是在同一类或命名空间中定义多个同名函数,根据参数的不同选择调用合适的函数,是静态多态性。
    • 函数重写是子类重新定义父类中的虚函数,允许在运行时根据对象的实际类型来调用合适的函数,是动态多态性。

    还是理解的不够深刻,再来一个例子

    代码2

    假设我们有一个基类Animal,它有一个虚函数makeSound,然后有两个派生类DogCat,它们都继承自Animal类,并分别重写了makeSound函数。

    1. #include
    2. class Animal {
    3. public:
    4. // 虚函数
    5. virtual void makeSound() {
    6. std::cout << "This is an animal sound." << std::endl;
    7. }
    8. };
    9. class Dog : public Animal {
    10. public:
    11. // 重写虚函数
    12. void makeSound() override {
    13. std::cout << "Dog barks: Woof! Woof!" << std::endl;
    14. }
    15. };
    16. class Cat : public Animal {
    17. public:
    18. // 重写虚函数
    19. void makeSound() override {
    20. std::cout << "Cat meows: Meow! Meow!" << std::endl;
    21. }
    22. };
    23. int main() {
    24. Animal* animal1 = new Dog(); // 创建一个指向Dog对象的指针
    25. Animal* animal2 = new Cat(); // 创建一个指向Cat对象的指针
    26. animal1->makeSound(); // 调用Dog的makeSound函数
    27. animal2->makeSound(); // 调用Cat的makeSound函数
    28. delete animal1;
    29. delete animal2;
    30. return 0;
    31. }

    让我们一步一步解释这个示例:

    1. 我们定义了一个基类Animal,其中有一个虚函数makeSound。虚函数的关键之一是它可以被派生类重写。

    2. 我们创建了两个派生类DogCat,它们都继承了Animal类,并重写了makeSound函数。每个子类都实现了自己的声音。

    3. main函数中,我们创建了两个指向基类Animal对象的指针,但实际上它们分别指向了DogCat的对象。这是多态性的体现,因为我们可以通过基类指针调用派生类的函数。

    4. 当我们通过这些指针调用makeSound函数时,由于它是虚函数,并且根据对象的实际类型来选择调用的函数,所以将分别调用DogCatmakeSound函数。

    运行程序,输出如下:

    1. Dog barks: Woof! Woof!
    2. Cat meows: Meow! Meow!

     

  • 相关阅读:
    layui.msg第一次弹出的提示很长
    Windows 应用商店无法打开解决办法
    Adult数据集预处理
    mysql总结
    Linux服务器的性能监控与分析
    Linux:文件解压、复制和移动的若干坑
    【appium】App类型、页面元素|UiAutomator与appium|App元素定位
    100个测试参与的项目如何高质量完成
    目前最流行的 5 大 Vue 动画库,使用后太炫酷了
    深度强化学习中Double DQN算法(Q-Learning+CNN)的讲解及在Asterix游戏上的实战(超详细 附源码)
  • 原文地址:https://blog.csdn.net/sqm472527736/article/details/132715277