mp05.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 84 行
C
84 行
#include "fail.h"
struct V {
virtual int bar() { return 1; };
virtual int foo() { return 2; };
virtual int ack() { return 3; };
};
struct D : virtual V {
};
struct S {
int v;
S(int v):v(v){}
};
struct T : S {
T(int v):S(v){}
};
struct Z : T {
Z(int v):T(v){}
};
struct Q : virtual Z, virtual V, virtual D {
Q() : Z(__LINE__) {}
};
typedef int (D::* mpD)( void );
typedef int (Q::* mpQ)( void );
mpQ sam( mpD x, D * )
{
return x;
}
void foo(int x)
{
switch( x ) {
case 0: throw S(x);
case 1: throw T(x);
case 2: throw Z(x);
default: throw int(x);
}
}
void ack()
{
try {
foo( 0 );
} catch( S &r ) {
if( r.v != 0 ) fail(__LINE__);
} catch( ... ) {
fail(__LINE__);
}
try {
foo( 1 );
} catch( T &r ) {
if( r.v != 1 ) fail(__LINE__);
} catch( ... ) {
fail(__LINE__);
}
try {
foo( 2 );
} catch( Z &r ) {
if( r.v != 2 ) fail(__LINE__);
} catch( ... ) {
fail(__LINE__);
}
try {
foo( 3 );
} catch( int r ) {
if( r != 3 ) fail(__LINE__);
} catch( ... ) {
fail(__LINE__);
}
}
int main()
{
D xx;
Q zz;
ack();
if( (zz.*(sam( &V::foo, &xx )))() != 2 ) fail(__LINE__);
_PASS;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?