C++中的隐藏规则是什么

What is the hiding rule in c++?

本文关键字:规则 是什么 隐藏 C++      更新时间:2023-10-16

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

覆盖类时会发生名称隐藏

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= ,它存在于每个类中并隐藏任何基类运算符;因此,为每个类生成了一个没有提供显式运算符的隐式定义,如果您已经在基类中定义了赋值运算符,这可能会令人惊讶。

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

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

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

在这里,如果您尝试在派生实例方法中使用foo(),即使确实有可用的foo()Base也会出错。

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

您可以在派生类中"导入"基名称,但这必须使用 using 显式完成。