我对名称隐藏和信息隐藏一词感到困惑。最重要的是,c ++中的隐藏规则是什么?有人可以给我一个定义吗?
答案 0 :(得分:4)
当您覆盖类时会发生名称隐藏:
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=
的一个,它存在于每个类中,隐藏任何基类运算符;因此,为每个没有提供显式运算符的类生成运算符的隐式定义,如果已经在基类中定义了赋值运算符,则可能会出乎意料。
答案 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
显式执行此操作。