c++ - 为什么编译成功?
问题描述
这段代码编译的原因是什么:
#include <iostream>
using namespace std;
class being {
public:
void running(char c) {
cout << "No one know ";
}
};
class human :public being {
public:
using being::running;
void running(char y) {
cout << "I am a human";
}
};
int main() {
human o;
o.running('A');
return 0;
}
the output : "I am a human"
我的意思是(我期望有错误(人类类中的重新定义函数)):此代码编译:
#include <iostream>
using namespace std;
class being {
public:
int v;
};
struct human :public being {
public:
double v;
};
int main() {
human o;
o.v = 55.2;
return 0;
}
但是当我添加(使用 being::v )
#include <iostream>
using namespace std;
class being {
public:
int v;
};
struct human :public being {
public:
using being::v;
double v;
};
int main() {
human o;
o.v = 55.2;
return 0;
}
出现错误:error C2086: 'int being::v': redefinition
为什么这个错误没有出现在第一个代码中?
解决方案
这是使用声明的预期行为。
如果派生类已经有一个具有相同名称、参数列表和限定条件的成员,则派生类成员隐藏或覆盖(不冲突)从基类引入的成员。
所以human::running(char)
隐藏 being::running(char)
而不是冲突。
编辑
第二个代码片段格式错误。对于数据成员,来自标准[namespace.udecl]/10:
如果一个由 using-declaration 命名且位于另一个声明的目标范围内的声明可能与它发生冲突([basic.scope.scope]),并且其中一个可以从另一个访问,则该程序是非良构的。如果位于同一作用域的两个使用声明命名的声明可能发生冲突,其中一个可以从另一个访问,并且它们都没有声明函数或函数模板,则程序是非良构的。
[例 6:
... namespace B { int i; ... } void func() { int i; using B::i; // error: conflicts ... ...
所以你不能using
being::v
与human::v
. 但是对于成员函数,[namespace.udecl]/11:
由位于类 C 中的 using-declarator 命名的声明集不包括与 C 中的函数或函数模板的声明相对应(因此会与之冲突)的基类的成员函数和成员函数模板。
[例 7:
struct B { virtual void f(int); virtual void f(char); void g(int); void h(int); }; struct D : B { using B::f; void f(int); // OK: D::f(int) overrides B::f(int); using B::g; void g(char); // OK using B::h; void h(int); // OK: D::h(int) hides B::h(int) }; ...
推荐阅读
- java - 将hdfs文件添加到hive并在udf中使用时,会出现错误
- gravity-forms-plugin - Gravity Forms - 通过通知电子邮件发送自定义数据
- flutter - 如何使用 Flutter 读取用户选择的文件?
- javascript - 处理“TypeError:无法读取属性‘split’ of null”错误
- reactjs - 如何使用 yup.addMethod() 为国家名称和代码编写自定义模式验证?
- java - Lambdas 函数 Kotlin 和类型 Mismatch
- azure-template - 如何创建应用功能的 ARM 模板?
- java - 我可以将字符串转换为具有泛型类型的列表吗?
- reactjs - react-dropzone 预览属性丢失
- asp.net - WebApi 返回空白 PDF 文件