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