#include <iostream>
using namespace std;
class A
{
public:
A(){ cout << "A" << endl; }
virtual void PrintfA() = 0;
};
class B
{
public:
B(){ cout << "B" << endl; }
};
class C :virtual public A , public B
{
public:
C()
{ cout << "C" << endl; }
void PrintfA()
{
cout << "hello word!!" << endl;
}
private:
};
int main()
{
C c;
return 0;
}

#include <iostream>
using namespace std;
typedef void (*Pfun)();
class Base
{
public:
virtual void Printf()
{
cout << "Base::Printf()" << endl;
}
void PrintfBae()
{
cout << "Base::PrintfBase" << endl;
}
};
class Son1:public Base
{
public:
virtual void Printf()
{
cout << "Son1::Printf()" << endl;
}
void PrintfSon1()
{
cout << "Son1::PrintfSon1()" << endl;
}
};
class Son2 : public Son1
{
public:
void Printf()
{
cout << "Son2::Printf()" << endl;
}
virtual void hello()
{
cout << "hello" << endl;
}
void PrintfSon2()
{
cout << "Son2::Printf()" << endl;
}
};
int main()
{
Son2 s2;
Base &b = s2;
Pfun fun = (Pfun)*((int *)*(int *)(int *)(&b) + 0);
fun();
fun = (Pfun)*((int *)*(int *)(int *)(&b) + 1);
fun();
fun = (Pfun)*((int *)*(int *)(int *)(&s2) + 0);
fun();
fun = (Pfun)*((int *)*(int *)(int *)(&b) + 1);
fun();
return 0;
}

#include<iostream>
using namespace std;
class A
{
public:
virtual void Printf()
{
cout << "A::Printf()" << endl;
}
virtual void PrintfA()
{
cout << "A::PrintfA()" << endl;
}
};
class B
{
public:
virtual void PrintfB()
{
cout << "B::Printf()" << endl;
}
virtual void Printf()
{
cout << "B::Printf()" << endl;
}
};
class C : public A, public B
{
public:
void Printf()
{
cout << "C::Printf()" << endl;
}
};
int main()
{
typedef void(*PFun)();
C c;
PFun fun = (PFun)*((int *)*(int *)((int *)(&c)+0) + 0);
fun();
fun = (PFun)* ((int *)*(int *)((int *)(&c) + 1) + 0);
fun();
cout << sizeof(c) << endl;
return 0;
}
