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 进行授权