C++笔记之虚函数重写规则、返回类型协变、函数的隐藏
code review!
文章目录
- C++笔记之虚函数重写规则、返回类型协变、函数的隐藏
- 1.返回类型协变
- 2.C++中函数的隐藏
—— C++ Primer Plus (第6版)
—— cppreference
1.返回类型协变
2.C++中函数的隐藏
在C++中,函数的隐藏是指在派生类中定义了与基类中的函数名称相同但参数列表不同的函数,从而隐藏了基类中的同名函数。这种情况下,派生类中的函数将会隐藏基类中的同名函数,使得在使用该函数时,编译器将只看到派生类中的函数而忽略基类中的函数。
函数的隐藏在C++中遵循以下规则:
- 当派生类中的函数名称与基类中的函数名称相同,但是参数列表不同(包括参数类型、个数或顺序)时,基类中的函数会被隐藏。
- 如果派生类中没有与基类中同名函数的情况下,则不会发生隐藏,基类中的函数会被正常继承到派生类中。
- 如果希望在派生类中同时使用基类中的同名函数,可以通过using声明来显式地引入基类函数,例如:
using Base::functionName;
。 - 隐藏只在名称查找时发生,而不会影响函数的重载。也就是说,派生类可以定义与基类中同名但参数列表不同的多个函数,它们不会相互隐藏。
以下是一个简单的示例,展示了函数的隐藏:
在这个示例中,Derived
类中的 show(int x)
函数隐藏了基类 Base
中的 show()
函数。通过 using Base::show;
声明,我们可以显式地调用基类的函数。
请注意,函数的隐藏是一种容易导致混淆和错误的情况,因此在设计派生类时,应该尽量避免使用与基类函数同名但参数列表不同的函数。
代码
#include <iostream>
class Base {
public:
void show() {
std::cout << "Base::show()" << std::endl;
}
};
class Derived : public Base {
public:
void show(int x) {
std::cout << "Derived::show(int)" << std::endl;
}
};
int main() {
Derived derived;
derived.show(); // 编译错误,因为Derived中的函数隐藏了Base中的函数
derived.Base::show(); // 使用using声明,显示调用Base类中的函数
derived.show(5); // 调用Derived类中的函数
return 0;
}