- 只有一个基类
#include <iostream>
#include <iomanip>
using namespace std;
int global = 0;
class A {
int i = ++global;
public:
virtual void show1() {
cout<<"hello world"<<endl;
}
virtual void show2() {
cout<<"hi "<<endl;
}
};
int main () {
A a, b;
cout<<"sizeof(A) = "<<sizeof(A)<<endl;
unsigned long* ptr = reinterpret_cast<unsigned long*>(&a);
cout<<"Object [a]:"<<endl;
cout<<" ptr[0] = "<<ptr[0]<<endl;
cout<<" ptr[1] = "<<ptr[1]<<endl;
ptr = reinterpret_cast<unsigned long*>(&b);
cout<<"Object [b]:"<<endl;
cout<<" ptr[0] = "<<ptr[0]<<endl;
cout<<" ptr[1] = "<<ptr[1]<<endl;
unsigned long vtable_addr = ptr[0];
unsigned long* vtable = reinterpret_cast<unsigned long*>(vtable_addr);
cout<<"vtable[0] = 0x"<<hex<<vtable[0]<<endl;
cout<<"vtable[1] = 0x"<<hex<<vtable[1]<<endl;
using pFunc = void(*)();
pFunc pf = reinterpret_cast<pFunc>(vtable[0]);
pf();
pf = reinterpret_cast<pFunc>(vtable[1]);
pf();
}
- 存在派生类
#include <iostream>
#include <iomanip>
#include <typeinfo>
using namespace std;
int global = 0;
class A {
int i = ++global;
public:
virtual void show1() {
cout<<"A::show1()"<<endl;
}
virtual void show2() {
cout<<"A::show2()"<<endl;
}
};
class B : public A {
public:
void show2() override {
cout<<"B::show2()"<<endl;
}
};
template <typename T> void dynamic();
int main() {
cout<<"class A"<<endl;
dynamic<A>();
cout<<"-------------"<<endl;
cout<<"class B"<<endl;
dynamic<B>();
}
template <typename T>
void dynamic () {
T a, b;
cout<<"sizeof("<<typeid(T).name()<<") = "<<sizeof(T)<<endl;
unsigned long* ptr = reinterpret_cast<unsigned long*>(&a);
cout<<"Object [a]:"<<endl;
cout<<" ptr[0] = "<<ptr[0]<<endl;
cout<<" ptr[1] = "<<ptr[1]<<endl;
ptr = reinterpret_cast<unsigned long*>(&b);
cout<<"Object [b]:"<<endl;
cout<<" ptr[0] = "<<ptr[0]<<endl;
cout<<" ptr[1] = "<<ptr[1]<<endl;
unsigned long vtable_addr = ptr[0];
unsigned long* vtable = reinterpret_cast<unsigned long*>(vtable_addr);
cout<<"vtable[0] = 0x"<<hex<<vtable[0]<<endl;
cout<<"vtable[1] = 0x"<<hex<<vtable[1]<<endl;
using pFunc = void(*)();
pFunc pf = reinterpret_cast<pFunc>(vtable[0]);
pf();
pf = reinterpret_cast<pFunc>(vtable[1]);
pf();
}