以下是派生类中如何使用基方法的简单示例:
struct Base {
void foo ();
Base& operator = (const Base&);
};
struct Derived : Base {
// ...
};
int main () {
Derived d1, d2;
d1.foo(); // calls Base::foo
d1 = d2; // calls Base::operator =
}
如果我在正文中添加以下语句Derived
以隐藏这两种方法,...
struct Derived : Base {
//...
private: // hide the below method for `Derived` objects
using Base::foo;
using Base::operator =;
}
...然后Base::foo()
成功隐藏(变得无法访问)。
但Base::operator =
仍然可以访问!
d1.foo(); // error
d1 = d2; // ok !!
同样的现象也发生在其他运营商身上。这是一个带有 g++ 的演示。
可访问性规则(由于using
关键字而应用)不应该以相同的方式应用于方法和运算符吗?
如果不是,那么语句的意义是什么:using operator =;
,编译器是否会忽略它?
更新:
- 我的第一个想法是,编译器可能会生成自己的 default
Derived::operator =
。这是错误的,因为它使用Base::operator =
. - 如果我使用
private
继承,则Base::foo()
自动隐藏(即使没有using
)。但对 没有影响Base::operator =
,它仍然有效。
请注意,我不想要“如何隐藏它”的解决方案。但是想从语言的角度理解,为什么运算符不像其他方法那样隐藏。