覆盖具有多个签名的C ++虚拟方法

时间:2012-05-29 20:24:23

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

我有一个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 );
}

2 个答案:

答案 0 :(得分:7)

您的定义是隐藏基类中的定义。为了使该定义在派生范围内可见,您需要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
};

答案 1 :(得分:2)

在派生类中,添加

using base::myMethod;