【问题标题】:What does C++ using mean inside a class?在类中使用 C++ 是什么意思?
【发布时间】:2011-03-05 16:33:43
【问题描述】:

在类定义中使用 using 是什么意思?

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

【问题讨论】:

    标签: c++ language-features using


    【解决方案1】:

    该声明取消隐藏一个基类成员。这最常用于允许成员函数的重载。示例:

    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;
    };
    

    【讨论】:

      【解决方案2】:

      我见过的案例:

      class A
      {
          void foo(int);
          void foo(float);
      }
      
      class B : public A
      {
          void foo(string);
      }
      
      B b;
      b.foo(12); // won't work!
      

      因为我在 B 中实现了一个具有不同签名的新 foo 函数,所以它对 A 隐藏了 foo 函数。为了覆盖这种行为,我会这样做:

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

      【讨论】:

        【解决方案3】:

        大多数情况下,这样的语法是这样使用的:

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

        这里的using 声明隐藏来自父类的成员声明。如果derived 中的另一个成员声明可能会隐藏base 中的成员,这有时是必要的。

        【讨论】:

          【解决方案4】:

          如果 anotherClass 是包含类似成员函数的基类

          virtual void f();
          

          你决定在派生类中重载函数

          virtual void f(int);
          

          它在基类中“隐藏”了 f()。例如,通过指向派生类的指针调用 f() 会导致错误,因为编译器不再“看到” f() 的版本不再从基类中获取参数。

          通过写作

          using Base::f;
          

          您可以将基类函数带回作用域,从而启用重载解析,正如您最初可能期望的那样。

          【讨论】:

            猜你喜欢
            • 2016-12-08
            • 2011-06-10
            • 2013-03-09
            • 1970-01-01
            • 1970-01-01
            • 2011-07-07
            • 2016-04-19
            • 2015-04-11
            • 2012-04-25
            相关资源
            最近更新 更多