为什么这个编译成功?

这段代码编译的原因是什么:

#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::vhuman::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)
};
...

以上是为什么这个编译成功?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>