其他分享
首页 > 其他分享> > 覆盖具有多个签名的C虚拟方法

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

作者:互联网

这个问题已经在这里有了答案:            >            Why does an overridden function in the derived class hide other overloads of the base class?                                    4个
我有一个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 );
}

解决方法:

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

标签:c,g,virtual-functions
来源: https://codeday.me/bug/20191011/1891918.html