C++ c+中的隐藏规则是什么+;?

C++ c+中的隐藏规则是什么+;?,c++,C++,我对名称隐藏和信息隐藏这两个术语感到非常困惑。最重要的是,C++中隐藏规则是什么?有人能给我一个定义吗?重写类时会发生名称隐藏: struct A { int x; int y; void foo(); void bar(); }; struct B : A { int y; void bar(); }; 在类B中,名称x和foo是明确的,并且引用基类中的名称。但是,名称y和bar隐藏基本名称。考虑以下事项: B b; b.bar(); 函

我对名称隐藏和信息隐藏这两个术语感到非常困惑。最重要的是,C++中隐藏规则是什么?有人能给我一个定义吗?

重写类时会发生名称隐藏:

struct A
{
    int x;
    int y;

    void foo();
    void bar();
};

struct B : A
{
    int y;
    void bar();
};
在类
B
中,名称
x
foo
是明确的,并且引用基类中的名称。但是,名称
y
bar
隐藏基本名称。考虑以下事项:

B b;
b.bar();
函数名是指函数
B::bar
的名称,没有歧义,因为基名称是隐藏的。如果您想要基本函数:
b.A::bar()
,就必须明确地说出来。或者,您可以使用::条添加
到您的类定义中,以取消隐藏名称,但是您必须处理歧义(如果存在不同的重载,这是有意义的)


可能最容易混淆的名称隐藏示例之一是
操作符=
,它存在于每个类中,并隐藏任何基类操作符;因此,会为每个类生成运算符的隐式定义,而这些类不提供显式定义,如果您已经在基类中定义了赋值运算符,则可能会感到意外。

信息隐藏与封装相同。这里有一个很好的起点

隐藏规则说,如果您派生一个类并在父类中添加与成员同名的成员,则该成员将“隐藏”父版本:

struct Base {
    void foo();
};

struct Derived : Base {
    void foo(int);
};
在这里,如果您尝试在派生实例方法中使用
foo()
,您将得到一个错误,即使
Base
中确实存在可用的
foo()

给出这样做的原因是为了避免混淆,例如base可能有
void foo(double)
和派生的
void foo(int)
。其基本原理是最好停止编译,而不是在生成的程序中出现意外行为


您可以在派生类中“导入”基名称,但这必须使用

明确完成。您在哪里听到这些术语的?没有正式命名为“隐藏规则”。处理隐藏的规则不止几个,通常是多个项目共享同一标识符(文本名称)。你能更具体地说一下你在说什么吗?更一般地说,只要在内部作用域和外部作用域中存在相同的名称,就会发生名称隐藏<代码>整数a=1;{inta=2;}断言(a==1)派生类和基类是内部作用域和外部作用域的一个例子。@Oktalist:谢谢,这是一个很好的观点。应该注意的是,你可以访问这些任意隐藏的名字的距离是有限制的<代码>::a
只会让你走到这一步。