Что означает использование C ++ внутри класса? - PullRequest
8 голосов
/ 05 марта 2011

Что означает использование внутри определения класса?

class myClass {
public:
  [...]
  using anotherClass::method;
};

Ответы [ 4 ]

17 голосов
/ 05 марта 2011

Это объявление показывает члена базового класса.Это чаще всего используется для разрешения перегрузок функции-члена.Пример:

class Base {
public:
   void method() const;
};

class Derived : public Base {
public:
   void method(int n) const;
   // Without the using, you would get compile errors on d.method();
   using Base::method;
};
6 голосов
/ 05 марта 2011

Случай, который я видел:

class A
{
    void foo(int);
    void foo(float);
}

class B : public A
{
    void foo(string);
}

B b;
b.foo(12); // won't work!

Поскольку я реализовал новую функцию foo в B с другой сигнатурой, она скрывает функции foo от A. Чтобы переопределить это поведение, я быделать:

   class B : public A
   {
       void foo(string);
       using A::foo;
   }
4 голосов
/ 05 марта 2011

Чаще всего такой синтаксис используется примерно так:

class derived : public base {
public:
    [...]
    using base::method;
};

Объявление using здесь показывает объявление члена из родительского класса. Это иногда необходимо, если другая декларация члена в derived может скрыть члена от base.

0 голосов
/ 05 марта 2011

Если anotherClass является базовым классом, который содержит функцию-член, например

virtual void f();

, и вы решили перегрузить функцию в производном классе, например

virtual void f(int);

, она "скрывает" f() в базовом классе.Например, вызов f () через указатель на производный класс приведет к ошибке, поскольку компилятор больше не «видит» версию f (), не принимающую аргументы из базового класса.

Byнаписав

using Base::f;

, вы можете вернуть функцию базовых классов обратно в область видимости, что позволит разрешить перегрузку, как вы и ожидали, что она будет работать в первую очередь.

...