为什么这个编译成功?
这段代码编译的原因是什么:
#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;
}
出现错误:错误 C2086: 'int being::v': redefinition
为什么这个错误没有出现在第一个代码中?
回答
这是使用声明的预期行为。
所以human::running(char) 隐藏 being::running(char)而不是冲突。
编辑
第二个代码片段格式错误。对于数据成员,来自标准[namespace.udecl]/10:
[示例 6:
... namespace B { int i; ... } void func() { int i; using B::i; // error: conflicts ... ...
所以你不能using being::v与human::v. 但是对于成员函数,[namespace.udecl]/11:
[示例 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) }; ...