#include <stdio.h>

// Base classes

class A
{
public:
	A(int a) {Ai = a;};
	int Ai;
};

class B
{
public:
	B(int b) {Bi = b;};
	int Bi;
	void TestThis(void* pChild)
	{printf("this: %x\nchild: %x\n", this, pChild);};
};

class C
{
public:
	C(int c) {Ci = c;};
	int Ci;
};

// Derived classes

class AB : public A, public B
{
public:
	AB(int a, int b, int ab) : A(a), B(b) {ABi = ab;};
	int ABi;
	void TestParent()
	{TestThis(this);};
};

class BA : public B, public A
{
public:
	BA(int b, int a, int ba) : B(b), A(a) {BAi = ba;};
	int BAi;
};

class AC : public A, public C
{
public:
	AC(int a, int c, int ac) : A(a), C(c) {ACi = ac;};
	int ACi;
};

class CA : public C, public A
{
public:
	CA(int c, int a, int ca) : C(c), A(a) {CAi = ca;};
	int CAi;
};

class BC : public B, public C
{
public:
	BC(int b, int c, int bc) : B(b), C(c) {BCi = bc;};
	int BCi;
};

class CB : public C, public B
{
public:
	CB(int c, int b, int cb) : C(c), B(b) {CBi = cb;};
	int CBi;
};

#define POINTER(val, off) \
	*(((int*)(&val)) + off)

int main(int argc, char* argv[])
{
	AB ab(1,2,3);
	BA ba(4,5,6);
	AC ac(7,8,9);
	CA ca(10,11,12);
	BC bc(13,14,15);
	CB cb(16,17,18);

	char* szFormatString =	"ab: %i, %i, %i\nba: %i, %i, %i\nac: %i, %i, %i\n"
							"ca: %i, %i, %i\nbc: %i, %i, %i\ncb: %i, %i, %i\n";
	printf(szFormatString,	POINTER(ab, 0), POINTER(ab, 1), POINTER(ab, 2),
							POINTER(ba, 0), POINTER(ba, 1), POINTER(ba, 2),
							POINTER(ac, 0), POINTER(ac, 1), POINTER(ac, 2),
							POINTER(ca, 0), POINTER(ca, 1), POINTER(ca, 2),
							POINTER(bc, 0), POINTER(bc, 1), POINTER(bc, 2),
							POINTER(cb, 0), POINTER(cb, 1), POINTER(cb, 2));
	printf("\n\n");

	ab.TestParent();

	return 0;
}