隐藏基类中的所有重载方法
Hiding of all overloaded methods in base class
最近我才知道这一点——如果一个派生类重新定义了基类成员方法,那么所有同名的基类方法都隐藏在派生类中。
#include<iostream>
using namespace std;
class Base
{
public:
int fun()
{
cout<<"Base::fun() called";
}
int fun(int i)
{
cout<<"Base::fun(int i) called";
}
};
class Derived: public Base
{
public:
int fun()
{
cout<<"Derived::fun() called";
}
};
int main()
{
Derived d;
d.fun(5); // Compiler Error
return 0;
}
错误:在函数int main()中:第30行:错误:调用'Derived::fun(int)'没有匹配的函数由于-Wfatal-errors导致编译终止。
只是想知道背后的原因吗?既然派生类是从Base
最根本的原因是为了使代码更健壮。
struct Base {
};
struct Derived : Base {
void f(long);
void g() { f(3); } // calls Derived::f
}
现在假设Base
在库中定义,并且您对该库进行了更新,并且更新更改了Base
的定义:
struct Base {
void f(int);
};
现在假设对重载函数的搜索没有在找到名称时停止。在这种情况下,Derived::g
将调用Base::f
而不是Derived::f
,并且您的派生类将悄悄地做一些与之前所做的完全不同的事情,并且与设计和文档所做的完全不同。
您已经发现派生类重载将通过相同的名称但不同的参数遮蔽(防止可见)基类方法。让我们假设这是出于历史原因或安全原因,并查看修复方法:
class Derived: public Base
{
public:
using Base::fun; // expose the base-class method
int fun()
{
cout<<"Derived::fun() called";
}
};
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 使用 nullptr 调用重载方法是不明确的
- 具有重载方法的可变参数数据结构
- C++11 重载方法,并转发到唯一方法
- 获取特定的模板重载方法指针
- std::result_of 应用于 const 重载方法
- 重载方法的类接受模板和基类 - 如何默认某个方法
- 推导模板类重载方法的地址会导致"error: expected primary-expression before ‘decltype’"
- C++如何使用按值传递和按引用传递的重载方法
- 具有原始方法参数派生类的 C++ 重载方法参数
- SWIG:在派生类中处理基类重载方法
- 在c++中的赋值运算符重载方法中删除旧的动态分配内存
- C++选择'wrong'默认参数的重载方法
- 重写重载方法会隐藏一些重载
- 在C++中,如何从父类变量的子类调用重载方法
- 所有重载方法的别名
- 使用 SWIG 在重载C++方法中设置类型