4

基本クラスに2つのバージョンoperator->(constでオーバーロード)があるとします。私が言うなら

using Base::operator->;

派生クラスでは、両方のバージョンにアクセスできますか、それとも非定数バージョンにアクセスできますか?

4

3 に答える 3

4

名前を隠すのと同じビジネス。それはすべてか無かです。宣言(7.3.3)を使用すると、メンバーではなく名前が表示されます。

ISO / IEC 14882(2003)、7.3.3。1 / using-declarationは、using-declarationが表示される宣言型領域に名前を導入します。その名前は、他の場所で宣言されているエンティティの名前の同義語です。

7.3.3を読むことをお勧めします。中には微妙なことがあります。使用することはできません-テンプレートを宣言します。使用する名前で参照されるすべてのメンバーにアクセスできる必要があります。名前は、使用する宣言が見つかったブロック内の名前と一緒にオーバーロード解決の対象と見なされます(つまり、何も非表示になりません)。 )などなど。

于 2011-08-09T15:58:45.113 に答える
3

その親で同じ名前のメソッド/演算子のすべてのバージョンにアクセスできます。

于 2011-08-09T13:50:21.857 に答える
2

両方とも。やってみましたか?(この答えは短いです:ああ、ここに例があります:

#include <iostream>
#include <string>

struct bar
{
  void foo() { std::cout << "non_c:foo()" << std::endl; }
  void foo() const { std::cout << "c:foo()" << std::endl; }
};

class base
{
public:
  bar* operator->() { return &b; }
  bar const* operator->() const { return &b; }

private:
  bar b;  
};

class derived : public base
{
public:
  using base::operator->;
};


int main(void)
{
  const derived d = derived();
  derived e;

  d->foo();
  e->foo();
}
于 2011-08-09T13:54:59.820 に答える