了解C++继承的范围
Understanding scope with inheritance in C++
我正在测试我对C++继承的理解,并正在阅读一些示例代码。根据程序输出,在我看来,double add()
和int add()
函数具有不同的作用域,而不是使用参数10.5调用double add()
函数,而是从double
到int
的隐式类型转换(始终被截断(,而是调用函数int add()
。类型转换将解释为什么输出11 11
。
我的问题如下:
- 重载的继承函数的范围是什么?
- 什么时候(如果有的话(从
double
到int
的类型转换无效(即会导致编译时错误(? - 在哪里可以阅读有关 C++ 中继承的命名空间/范围的细微差别的更多信息?
#include <iostream>
using namespace std;
class One {
public:
double add(double x) { return x + 0.1; }
};
class Two : public One {
public:
int add(int x) { return x + 1; }
};
int main(int argc, char *argv[]) {
Two obj;
cout << obj.add(10) << " " << obj.add(10.5) << endl;
return 0;
}
> 将add
声明为int add(int x) { return x + 1; }
从外部作用域隐藏了add
的任何其他定义,这与函数中嵌套块中的变量阴影相同的行为。
名称查找始终在作用域中查找名称,然后再在同一作用域中多次出现该名称时进行潜在的重载解析;obj.add(10.5)
找到Two::add()
,因此不会继续检查外部作用域。
您可以使用 Two 重新声明外部作用域中的函数using One::add;
在转换主题上,double
参数始终与int
参数匹配。如果双精度值超出int
范围,但这是运行时未定义的行为(无需诊断(,则它可能无效。
本主题在 C++ 常见问题解答 中介绍,您还可以查看有关 cpp首选项的名称查找文章.
重载不适用于C++中的继承:
重载不适用于C++编程中的派生类 语言。基础和派生之间没有过载解决方案。 编译器查看派生的范围,找到单个 函数"Double F(double("并调用它。它从不打扰 (封闭(基础范围。在C++中,没有过载 作用域 – 派生类作用域不是此常规的例外 统治
他们使用的示例在派生类中具有double f(double)
。
https://www.geeksforgeeks.org/does-overloading-work-with-inheritance/
要解决此问题,必须重新设计该类。我无法就如何更改它给出任何具体的反馈,因为该类非常通用。
除了上面的答案之外,我还想补充一点,您可以通过为One::add()
创建一个模板来避免重载问题,该模板将允许它接受整数和双精度,然后让类Two
继承它。
#include <iostream>
using namespace std;
class One {
public:
template <typename T> //Template allows us to create a function template whose functionality can be adapted to more than one type or class without repeating the entire code for each type.
double add(T x)
{
if (floor(x) == x) //Check if x is integer
return x + 1;
else
{
return x + 0.1;
}
}
};
class Two : public One {
public:
//No need for overloading add() here because in Class One, add() function will accept integers and doubles
};
int main(int argc, char* argv[]) {
Two obj;
cout << obj.add(10) << " " << obj.add(10.5) << endl;
return 0;
}
- 为什么在全局范围内使用"extern int a"似乎不行?
- 继承函数的重载解析
- 尝试通过多个向量访问变量时,向量下标超出范围
- 继承期间显示未知行为的子类
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 头文件-继承c++
- 使用std::transform将一个范围的元素添加到另一个范围中
- 为什么在保护模式下继承升级不起作用
- 在基于范围的for循环中使用结构化绑定声明
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 了解C++继承的范围
- 模板化继承中的范围解析(可能称为 mixin)
- 在继承范围时混乱
- 可能的继承范围问题:
- 为什么需要在模板继承中使用范围解析
- 继承:在派生类的范围内求值?
- 将赋值/构造函数移出继承范围