extern "C" int printf (const char *, ...);
extern "C" void exit (int);
void die () { printf ("FAIL\n"); exit (1); }
class BaseClass {
friend int operator != (const BaseClass irv, int x);
int i;
public:
BaseClass( const BaseClass& ir ) : i(ir.i) {};
BaseClass() : i(5) {};
virtual int virtMember() { return( 999 ); };
void Increm( int r );
};
void BaseClass::Increm( int r )
{
if ((i == 5 && virtMember () == 30)
|| (i == 7 && virtMember () == 30))
i += r;
else
die ();
}
class DerivedClass : public BaseClass {
public:
int virtMember() { return( 30 ); };
};
int operator != (const BaseClass irv, int x) { return irv.i != x; }
int
main ()
{
DerivedClass a;
if (a != 5 || a.virtMember () != 30)
die ();
a.Increm(2);
if (a != 7 || a.virtMember () != 30)
die ();
DerivedClass b = a;
if (b != 7 || a.virtMember () != 30)
die ();
b.Increm(2);
if (b != 9 || a.virtMember () != 30)
die ();
printf ("PASS\n");
}