我对术语名称隐藏和信息隐藏感到非常困惑。最重要的是,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()
。或者,您可以将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
显式完成。