为什么C 不支持范围内的过载
Why C++ does not support overloading across scopes?
我相信这里已经给出了最好的答案:为什么在派生类中覆盖的函数隐藏了基类的其他过载?
但是我有点困惑,特别是与以下陈述:
为了覆盖此行为,用户需要明确的诉讼:最初是对继承方法的重新分支(当前已弃用),现在明确使用使用declaration。
。
假设我有以下程序:
#include <iostream>
using namespace std;
class Base
{
public:
int f(int i)
{
cout << "f(int): ";
return i+3;
}
};
class Derived : public Base
{
public:
double f(double d)
{
cout << "f(double): ";
return d+3.3;
}
};
int main()
{
Derived* dp = new Derived;
cout << dp->f(3) << 'n';
cout << dp->f(3.3) << 'n';
delete dp;
return 0;
}
我有两个问题:
我可以假设,W.R.T派生的类对象,
int f(int i)
函数根本不存在。这不是由于隐藏名称而继承的。如果我必须在派生类中使用此功能,我必须在派生类中再次定义它?
- 我可以假设,W.R.T派生的类对象,根本不存在int f(int i)函数。这不是由于隐藏名称而继承的。
it 是继承,只是... hidden ,如果您不指定范围(不合格的名称查找。您可以指定它)明确使用范围分辨率运算符::
(合格的名称查找):
dp->Base::f(3);
- 如果我必须在派生类中使用此功能,则必须在派生类中再次定义它?
如引用的答案所说,您可以通过"明确使用使用解释"来完成。
class Derived : public Base
{
public:
using Base::f;
...
};
编辑(有关评论的补充问题)
- 如果它是隐藏的,那意味着我可以再次声明它?同名,相同的参数?
是的,你可以。它仍然是隐藏的名字。
- 如果是,如果我还添加了
using Base::f
以及新声明怎么办?它会导致双重定义吗?
不,这不是双重定义。使用声明只会将名称引入派生的类范围。并且在派生类中声明的成员函数将隐藏从基类引入的函数,它仍然是隐藏的。(请注意,您仍然可以通过dp->Base::f(3);
调用基类。)
如果派生类已经具有具有相同名称,参数列表和资格的成员,则派生的类成员生皮或覆盖(不与)从基类引入的成员。
相关文章:
- 不计算一个范围内的完美数
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 变量不在 lambda 的范围内
- 简化在 Pybind11 中为 C++ 模板类生成包装类:模板声明不能出现在块范围内
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 如何将不在 QT 全局范围内的函数附加到 Qwidget 上
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- 在命名成员函数重载解析期间,"this"何时不在范围内?
- 非命名空间范围内的显式专用化不会在 GCC 中编译
- 随机选择 2 个不在范围内的整数
- 如何创建一个结构的实例,当它不在范围内时,该实例将不会被删除
- 为什么即将到来的范围库不支持一个范围的容器初始化
- 为什么所有可能的整数都"true"在 C++ 的 if 语句内的 long int 范围内,而 0 不是?
- 自动和范围内 for 循环 C++11 不起作用
- 为什么C++不支持基于范围的动态数组的 for 循环?
- 模板声明不能出现在块范围内
- 测试整数是否在范围内时,逻辑错误和不正确输出
- 为什么C 不支持范围内的过载
- Main 不能调用函数:函数未在此范围内声明
- 包含的功能在以后的范围内不可用