以下は、派生クラスで基本メソッドを使用する方法の簡単な例です。
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 =;
、コンパイラによって単に無視されますか?
更新:
- 私の最初の考えは、コンパイラが独自のデフォルトを生成している可能性があるということでした
Derived::operator =
。を使っているので間違いBase::operator =
です。 private
継承を使用すると、Base::foo()
自動的に非表示になります (なくてもusing
)。しかし、影響はありませんBase::operator =
。まだ機能しています。
「非表示にする方法」の解決策は望まないことに注意してください。しかし、言語の観点から、演算子が他のメソッドのように非表示にならない理由を理解したいと思います。