【问题标题】:Overriding C++ virtual methods with multiple signatures [duplicate]覆盖具有多个签名的 C++ 虚拟方法 [重复]
【发布时间】:2012-06-04 02:13:27
【问题描述】:

我有一个 C++ 基类,它声明了一个具有两个不同签名的虚拟方法。

一旦我覆盖派生类中的一个虚拟方法签名,编译器(g++ 4.6.3 和 g++ 4.7)就不再能够将该方法与同一派生类中的第二个签名匹配。

如果我只将 SPECIALIZE_ONEARG 定义为 1,下面的示例代码将无法编译。为了让它再次编译,我还必须将 PASSTHRU_TWOARG 定义为 1。使用“PASSTHRU”方法并不理想,因为效率和因为真正的类层次结构要深得多,我不希望在对基类的调用中硬连线。

这种行为是 g++ 特有的,还是我只是想做一些 C++ 不支持的事情?

#define SPECIALIZE_ONEARG ( 0 )
#define PASSTHRU_TWOARG   ( 0 )

class base
{
public:
  virtual int myMethod( char a )         { return 1; }
  virtual int myMethod( char a, int b )  { return 2; }
};

class derived : public base
{
public:
#if SPECIALIZE_ONEARG
  virtual int myMethod( char a )         { return 3; }
#endif // SPECIALIZE_ONEARG

#if PASSTHRU_TWOARG
  virtual int myMethod( char a, int b )  { return base::myMethod( a, b ); }
#endif // PASSTHRU_TWOARG
};

int main( int argc, char* argv[])
{
  derived myObj;

  return myObj.myMethod( 'a' ) * 10 + myObj.myMethod( 'b', 0 );
}

【问题讨论】:

    标签: c++ g++ virtual-functions


    【解决方案1】:

    在派生类中,添加

    using base::myMethod;
    

    【讨论】:

      【解决方案2】:

      您的定义隐藏基类的定义。为了使该定义在您的派生范围内可见,您需要using base::myMethod。

      class derived : public base
      {
      public:
        using base::myMethod; // <--- here
      
      #if SPECIALIZE_ONEARG
        virtual int myMethod( char a )         { return 3; }
      #endif // SPECIALIZE_ONEARG
      
      #if PASSTHRU_TWOARG
        virtual int myMethod( char a, int b )  { return base::myMethod( a, b ); }
      #endif // PASSTHRU_TWOARG
      };
      

      【讨论】:

      • 完美运行。感谢您的帮助。
      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 2016-01-24
      • 2011-05-21
      • 2012-11-28
      • 2021-03-26
      • 2014-08-13
      • 2011-03-10
      相关资源
      最近更新 更多