C++中的重载、覆盖、隐藏与重写的区别

C++中的重载、覆盖、隐藏与重写的区别

在C++中,理解函数的重载、覆盖、隐藏与重写是很重要的,它们是面向对象编程中的基本概念。这篇博客将详细讲解这四者之间的区别,以及它们各自的特性和用法。

1. 函数重载 (Overloading)

函数重载允许在同一个作用域中定义多个同名函数。这些函数通过不同的参数类型、参数数量或参数顺序来区分。在编译时,编译器会根据函数调用时传入的参数类型来決定调用哪个具体的函数。

示例

void func(int a) {
    std::cout << "Integer version: " << a << std::endl;
}

void func(double b) {
    std::cout << "Double version: " << b << std::endl;
}

void func(int a, double b) {
    std::cout << "Mixed version: " << a << ", " << b << std::endl;
}

上述代码中,func函数有三个不同的版本,分别接受不同类型或数量的参数。

2. 函数覆盖 (Overriding)

函数覆盖是指在派生类中重新定义基类中的虚函数。当派生类定义了一个与基类中同名的虚函数时,派生类中的函数会替代基类中的版本。这种机制通过运行时多态性实现,使得基类的指针或引用能够调用派生类的版本。

示例

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

class Derived : public Base {
public:
    void show() override {  // 覆盖
        std::cout << "Derived class show" << std::endl;
    }
};

在这个例子中,Derived类覆盖了Base类中的show函数。

3. 函数隐藏 (Hiding)

函数隐藏是指在派生类中定义了一个与基类同名的非虚函数,导致基类的同名函数在该作用域中不可见。派生类中的函数会遮蔽基类中的同名函数。

示例

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

class Derived : public Base {
public:
    void show(int a) {  // 隐藏
        std::cout << "Derived class show with int" << std::endl;
    }
};

在这个示例中,Derived类中的show(int a)函数隐藏了基类的show()函数。

4. 函数重写 (Rewriting)

在C++中,重写通常是指覆盖的同义词,强调在派生类中重新定义基类的虚函数。为了避免潜在的错误,C++11引入了override关键字,用于指明一个函数是对基类虚函数的重写。

示例

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

class Derived : public Base {
public:
    void show() override {  // 重写
        std::cout << "Derived class show" << std::endl;
    }
};

总结

在C++中,重载、覆盖、隐藏和重写是非常重要的概念,理解它们的区别有助于更好地掌握面向对象编程。这些机制不仅提高了代码的灵活性和可维护性,还支持了多态的实现:

  • 重载:同一作用域中同名但参数不同的多个函数。
  • 覆盖:派生类中同名虚函数替代基类中的版本。
  • 隐藏:派生类中同名非虚函数遮蔽基类中的同名函数。
  • 重写:强调在派生类中重新定义基类的虚函数,并可以使用override关键字进行标记。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值