文章

C++面向对象三个概念——重载、覆盖和隐藏

C++面向对象三个概念——重载、覆盖和隐藏

1. overload 重载

  • 同名函数,参数个数或类型不同;
  • 相同作用域,即同一个类。

2. override 覆盖

  • 不在一个作用域,即父类与子类;
  • 子类函数与基类函数同名,参数个数和类型相同;
  • 基类使用virtual关键字,子类使用override关键字。

例外的一个点是协变:基类返回基类指针,子类返回子类指针。此时也是override

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
class Base {
public:
    virtual Base* clone() const {
        std::cout << "Base::clone()" << std::endl;
        return new Base(*this);
    }
};
 
class Derived : public Base {
public:
    // 使用协变返回类型,返回类型是 Base 的派生类型 Derived*
    virtual Derived* clone() const override {
        std::cout << "Derived::clone()" << std::endl;
        return new Derived(*this);
    }
};

int main() {
    Derived d;
    Base* ptr = &d;
    Base* newPtr = ptr->clone(); // 调用 Derived::clone()
    delete newPtr;
    return 0;
}

3. hide 隐藏

作用域不同,同名函数不能生成override,而是覆盖。子类中的成员函数、数据成员,将覆盖基类中的同名函数、数据成员。

如果要调用基类中的同名函数,需要使用基类名::函数名,或者使用using引入。

4. 引用

本文由作者按照 CC BY 4.0 进行授权