名字隐藏指派生类同名成员屏蔽基类所有同名函数,无论参数或虚函数属性,发生在编译期;重写则要求派生类函数与基类虚函数签名相同,实现多态,发生在运行期。

在C++的继承机制中,名字隐藏和重写(override)是两个容易混淆但本质不同的概念。理解它们的区别对正确使用多态和继承至关重要。
当派生类中定义了一个与基类同名的函数(无论参数列表是否相同)或变量,基类中的同名成员将被隐藏,即使函数签名不同。
这种隐藏不依赖于函数的参数列表,也不要求是虚函数。
示例:
立即学习“C++免费学习笔记(深入)”;
class Base {
public:
void func() { cout << "Base::func()" << endl; }
void func(int x) { cout << "Base::func(int)" << endl; }
};
<p>class Derived : public Base {
public:
void func(double x) { cout << "Derived::func(double)" << endl; }
};</p><p>// 调用
Derived d;
d.func(); // 错误!Base::func() 被隐藏,无法直接调用
d.func(1); // 错误!Base::func(int) 也被隐藏
d.func(3.14); // OK,调用 Derived::func(double)</p>要恢复基类函数的可见性,可以使用 using 声明:
class Derived : public Base {
public:
using Base::func; // 引入基类所有 func 重载
void func(double x) { cout << "Derived::func(double)" << endl; }
};
重写是指派生类中提供一个与基类虚函数具有相同签名的函数,实现多态。
重写发生在运行时,通过虚函数表实现动态绑定。
示例:
立即学习“C++免费学习笔记(深入)”;
class Base {
public:
virtual void show() { cout << "Base::show()" << endl; }
};
<p>class Derived : public Base {
public:
void show() override { cout << "Derived::show()" << endl; } // 正确重写
};</p>调用时体现多态:
Base* ptr = new Derived(); ptr->show(); // 输出 "Derived::show()",动态绑定
简单说:隐藏是名字层面的覆盖,重写是接口层面的多态实现。
使用 override 关键字能有效避免误写成隐藏而本意是重写的问题。
基本上就这些。
以上就是C++继承中的隐藏 名字隐藏与重写区别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号