覆盖具有多个签名的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