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

时间:2013-09-08 21:25:37

标签: c++

我对名称隐藏和信息隐藏一词感到困惑。最重要的是,c ++中的隐藏规则是什么?有人可以给我一个定义吗?

3 个答案:

答案 0 :(得分:4)

当您覆盖类时会发生名称隐藏

struct A
{
    int x;
    int y;

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

struct B : A
{
    int y;
    void bar();
};

在类B中,名称xfoo是明确的,并且引用基类中的名称。但是,名称ybar 隐藏基本名称。请考虑以下事项:

B b;
b.bar();

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

最隐蔽的名称隐藏示例之一可能是operator=的一个,它存在于每个类中,隐藏任何基类运算符;因此,为每个没有提供显式运算符的类生成运算符的隐式定义,如果已经在基类中定义了赋值运算符,则可能会出乎意料。

答案 1 :(得分:3)

信息隐藏与封装相同。这是一个很好的起点http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29

答案 2 :(得分:2)

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

struct Base {
    void foo();
};

struct Derived : Base {
    void foo(int);
};

如果您尝试在派生实例方法中使用foo(),则会出现错误,即使foo()中确实存在Base

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

您可以在派生类中“导入”基本名称,但必须使用using显式执行此操作。