目录
1.没有继承关系的虚表
#include <iostream>
using namespace std;
class A
{
public:
virtual void fa() { cout << "A::fa" << endl; }
virtual void ga() { cout << "A::ga" << endl; }
virtual void ha() { cout << "A::ha" << endl; }
void ff() { cout << "A::FF" << endl; }
A(int i = 0, A* ap = nullptr) :m_i(i), p(ap)
{
;
}
private:
int m_i;
A* p;
};
int main()
{
A a;
typedef void (*Fun)();
Fun pf = (Fun) * (((int*)*(int*)(&a)) + 0);
pf();
pf = (Fun) * (((int*)*(int*)(&a)) + 1);
pf();
pf = (Fun) * (((int*)*(int*)(&a)) + 2);
pf();
return 0;
}
2.存在继承关系
#include <iostream>
using namespace std;
class A
{
public:
virtual void fa() { cout << "A::fa" << endl; }
virtual void ga() { cout << "A::ga" << endl; }
virtual void ha() { cout << "A::ha" << endl; }
};
class B :public A
{
public:
virtual void fb() { cout << "B::fb" << endl; }
virtual void gb() { cout << "B::gb" << endl; }
};
int main()
{
B b;
cout << sizeof(b) << endl;
typedef void (*Fun) ();
Fun fn = (Fun) *((int*)*(int*)&b + 0);
fn();
fn = (Fun) * ((int*)*(int*)&b + 1);
fn();
fn = (Fun) * ((int*)*(int*)&b + 2);
fn();
fn = (Fun) * ((int*)*(int*)&b + 3);
fn();
fn = (Fun) * ((int*)*(int*)&b + 4);
fn();
return 0;
}
3.存在改写
/*
存在改写
*/
#include <iostream>
using namespace std;
class A
{
public:
virtual void fa() { cout << "A::fa" << endl; }
virtual void ga() { cout << "A::ga" << endl; }
virtual void ha() { cout << "A::ha" << endl; }
};
class B :public A
{
public:
virtual void fa() { cout << "B::fa" << endl; } //覆盖
virtual void hm() { cout << "B::hm" << endl; }
};
int main()
{
B b;
cout << sizeof(b) << endl;
return 0;
}
4. 多重继承
/*
多重继承
*/
#include <iostream>
using namespace std;
class A
{
public:
virtual void fa() { cout << "A::fa" << endl; }
virtual void ga() { cout << "A::ga" << endl; }
};
class B
{
public:
virtual void fb() { cout << "B::fb" << endl; }
virtual void gb() { cout << "B::gb" << endl; }
};
class C
{
public:
virtual void fc() { cout << "C::fc" << endl; }
virtual void gc() { cout << "C::gc" << endl; }
};
class D :public A, public B, public C
{
public:
virtual void fd() { cout << "D::fd" << endl; }
virtual void gd() { cout << "D::gd" << endl; }
};
int main()
{
D d;
cout << sizeof(d) << endl;
return 0;
}
多继承中派生类新添加的虚函数会挂在第一个虚指针所指向的虚表中
int main()
{
D d;
cout << sizeof(d) << endl;
typedef void (*Fun)();
Fun fu = (Fun) * ((int*)*(int*)&d + 0);
fu();
fu = (Fun) * ((int*)*(int*)&d + 1 );
fu();
fu = (Fun) * ((int*)*(int*)&d + 2);
fu();
fu = (Fun) * ((int*)*(int*)&d + 3);
fu();
fu = (Fun) * ((int*)*((int*)&d + 1) + 0);
fu();
fu = (Fun) * ((int*)*((int*)&d + 1) + 1);
fu();
fu = (Fun) * ((int*)*((int*)&d + 2) + 0);
fu();
fu = (Fun) * ((int*)*((int*)&d + 2) + 1);
fu();
return 0;
}
5.多重继承中存在重写
/*
多重继承
存在重写
*/
#include <iostream>
using namespace std;
class A
{
public:
virtual void fa() { cout << "A::ff" << endl; }
virtual void ga() { cout << "A::ga" << endl; }
};
class B
{
public:
virtual void ff() { cout << "B::ff" << endl; }
virtual void gb() { cout << "B::gb" << endl; }
};
class C
{
public:
virtual void ff() { cout << "C::ff" << endl; }
virtual void gc() { cout << "C::gc" << endl; }
};
class D :public A, public B, public C
{
public:
virtual void ff() { cout << "D::ff" << endl; }
virtual void gd() { cout << "D::gd" << endl; }
};
int main()
{
D d;
return 0;
}