#include <iostream>
using namespace std;
class A
{
public:
unsigned long long i;
virtual void funcA() {
cout << "in A virtual funcA" <<endl;
}
virtual void funcCommon() {
cout << "in A virtual funcCommon" <<endl;
}
void p_A_i() {
cout << "A part print ==== i = " << i << ", &i = " << &i <<endl;
}
};
class A1
{
public:
unsigned long long i;
virtual void funcCommon() {
cout << "in A funcCommon" <<endl;
}
virtual void func2() {
}
void p_A_i() {
cout << "A part print ==== i = " << i << ", &i = " << &i <<endl;
}
void p_A_i_1() {
cout << "A part print p_A_i_1 ==== i = " << i << ", &i = " << &i <<endl;
}
};
class B : public A
{
public:
unsigned long long i;
unsigned long long j;
virtual void funcCommon() {
cout << "in B virtual funcCommon" <<endl;
}
virtual void funcB() {
cout << "in B virtual funcB" <<endl;
}
void p_B_i() {
cout << "B part print ==== i = " <<i << ", &i = "<< &i
<< ", &j = " <<&j <<endl;
}
};
typedef void (*func)();
int main()
{
B b;
b.i = 10;
b.A::i = 88;
cout << "sizeof (&b) = " << sizeof(&b) <<endl ;
cout << "----------------------------------------" << endl;
cout << "sizeof (A) = " << sizeof(A) << ", sizeof(A1) = " <<sizeof(A1)<<endl ;
cout << "----------------------------------------" << endl;
cout << "&b = " << &b << ", b.i = " << b.i <<endl ;
cout << "----------------------------------------" << endl;
b.p_A_i();
b.p_B_i();
cout << "----------------------------------------" << endl;
// &base : base首地址
// (unsigned long*)&base : base的首地址,vptr的地址
// (*(unsigned long*)&base) : vptr的内容,即vtable的地址,指向第一个虚函数的slot的地址
// (unsigned long*)(*(unsigned long*)&base) : vtable的地址,指向第一个虚函数的slot的地址
// vtbl : 指向虚函数slot的地址
// *vtbl : 虚函数的地址
unsigned long* vtbl = (unsigned long*)(*(unsigned long*)&b);
func pfunc = (func)*(vtbl);
pfunc();
cout << "----------------------------------------" << endl;
vtbl++;
func pfunc1 = (func)*(vtbl);
pfunc1();
cout << "----------------------------------------" << endl;
vtbl++;
func pfunc2 = (func)*(vtbl);
pfunc2();
cout << "----------------------------------------" << endl;
return 0;
}
sizeof (&b) = 8
----------------------------------------
sizeof (A) = 16, sizeof(A1) = 16
----------------------------------------
&b = 0x7fff20f56d70, b.i = 10
----------------------------------------
A part print ==== i = 88, &i = 0x7fff20f56d78
B part print ==== i = 10, &i = 0x7fff20f56d80, &j = 0x7fff20f56d88
----------------------------------------
in A virtual funcA
----------------------------------------
in B virtual funcCommon
----------------------------------------
in B virtual funcB
----------------------------------------