C++中的隐藏规则是什么
What is the hiding rule in 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();
函数名称是指函数的名称,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
显式完成。
相关文章:
- 为什么此指针值不能转换为整数的规则是什么?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 自动参数捕获的扣除规则是什么?
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 在平等符号左侧使用RVALUE参考的规则是什么?
- 类静态变量初始化的规则是什么?
- 初始化中的模板转换运算符类型推导规则是什么?
- 将临时值存储为某种数据类型时,算术运算的标准规则是什么
- 使用“void”来专门化模板的规则是什么?
- 对于C++,在另一个函数中定义一个函数的可行性规则是什么?
- 有人能解释一下最多一次不变和存在、所有权和守恒规则是什么吗?
- 标准函数的函数指针和成员函数指针的规则是什么
- 在C++11类型推理过程中,控制优先级的规则是什么
- 从char数组中强制转换*时,严格的别名规则是什么
- 对于 C++ lambda,通过引用捕获引用的规则是什么
- decltype(右值表达式)的类型推导规则是什么
- 对于默认定义的移动构造函数,noexcept的规则是什么
- 在好友声明中使用限定名称的规则是什么?