vf01.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 84 行

C
84
字号
#include "fail.h"

void check( int v, int c, unsigned line )
{
    if( v != c ) {
	fail( line );
    }
}

struct X {
    virtual int AA() { return 'a'; }
    virtual int BB() { return 'b'; }
};

struct A : virtual X {
    virtual int AA() { return 'A'; }
};

struct B : virtual X {
    virtual int BB() { return 'B'; }
};

struct only_A : A {
};

struct only_B : B {
};

struct both_AB : A, B {
};

struct derived_from_both_AB : both_AB {
};

void unknown_ref( only_A &xA, only_B &xB, both_AB &xAB, derived_from_both_AB &xDAB )
{
    check( xA.AA(), 'A', __LINE__ );
    check( xA.BB(), 'b', __LINE__ );
    check( xB.AA(), 'a', __LINE__ );
    check( xB.BB(), 'B', __LINE__ );
    check( xAB.AA(), 'A', __LINE__ );
    check( xAB.BB(), 'B', __LINE__ );
    check( xDAB.AA(), 'A', __LINE__ );
    check( xDAB.BB(), 'B', __LINE__ );
}

void unknown_ptr( A *pA, B *pB, int caa, int cab, int cba, int cbb )
{
    X *pX;

    check( pA->AA(), caa, __LINE__ );
    check( pA->BB(), cab, __LINE__ );
    check( pB->AA(), cba, __LINE__ );
    check( pB->BB(), cbb, __LINE__ );
    pX = pA;
    check( pX->AA(), caa, __LINE__ );
    check( pX->BB(), cab, __LINE__ );
    pX = pB;
    check( pX->AA(), cba, __LINE__ );
    check( pX->BB(), cbb, __LINE__ );
}

int main()
{
    only_A xA;
    only_B xB;
    both_AB xAB;
    derived_from_both_AB xDAB;

    unknown_ref( xA, xB, xAB, xDAB );
    check( xA.AA(), 'A', __LINE__ );
    check( xA.BB(), 'b', __LINE__ );
    check( xB.AA(), 'a', __LINE__ );
    check( xB.BB(), 'B', __LINE__ );
    check( xAB.AA(), 'A', __LINE__ );
    check( xAB.BB(), 'B', __LINE__ );
    check( xDAB.AA(), 'A', __LINE__ );
    check( xDAB.BB(), 'B', __LINE__ );
    unknown_ptr( &xA, &xB, 'A', 'b', 'a', 'B' );
    unknown_ptr( &xAB, &xAB, 'A', 'B', 'A', 'B' );
    unknown_ptr( &xDAB, &xDAB, 'A', 'B', 'A', 'B' );
    _PASS;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?