讲的很生动,但是有些小问题,评论里面有些说的非常详细。实验一把
class Base
{
public:
virtual void f(){cout<<"Base::f()"<<endl;}
virtual void g(){cout<<"Base::g()"<<endl;}
virtual void h(){cout<<"Base::h()"<<endl;}
protected:
private:
};
class Base2
{
public:
virtual void f(){cout<<"Base2::f()"<<endl;}
virtual void g(){cout<<"Base2::g()"<<endl;}
virtual void h(){cout<<"Base2::h()"<<endl;}
protected:
private:
};
//无覆盖,这样的话,虚函数就在原来的虚函数表后面追加就行了
class Derived:public Base
{
public:
virtual void f1(){cout<<"Derived::f1()"<<endl;}
virtual void g1(){cout<<"Derived::g1()"<<endl;}
virtual void h1(){cout<<"Derived::h1()"<<endl;}
};
//有覆盖,这样的话相同的函数给覆盖掉
class Derived_cover:public Base
{
public:
virtual void f(){cout<<"Derived_cover::f()"<<endl;}
virtual void g1(){cout<<"Derived_cover::g1()"<<endl;}
virtual void h1(){cout<<"Derived_cover::h1()"<<endl;}
};
//多重继承,无覆盖
class multipleDerived:public Base, public Base2
{
public:
virtual void f1(){cout<<"multipleDerived::f1()"<<endl;}
virtual void g1(){cout<<"multipleDerived::g1()"<<endl;}
};
//多重继承,有覆盖
class multipleDerivedCover:public Base, public Base2
{
public:
virtual void f(){cout<<"multipleDerivedCover::f()"<<endl;}
virtual void g1(){cout<<"multipleDerivedCover::g1()"<<endl;}
};
typedef void(*fun)(void);
//测试虚函数与虚函数表的存放关系
void test1()
{
Base b;
fun pfun = NULL;
cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;
//通过指针直接访问虚函数表里面函数的内容
pfun = (fun)(int*)*(int*)*(int*)(&b);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&b)+1);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&b)+2);
pfun();
}
//测试没有函数覆盖的情况,直接在原来的虚函数表后面追加
void test2()
{
Base b;
Derived derive;
fun pfun = NULL;
cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;
cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;
cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;
cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;
cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;
//打印出虚函数内容
pfun = (fun)(int*)*(int*)*(int*)(&derive);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+5);
pfun();
}
//有覆盖的情况,直接将原来的函数覆盖掉就行了
void test3()
{
Base b;
Derived_cover derive;
fun pfun = NULL;
cout<<"虚函数表地址"<<(int*)*(int*)(&b)<<endl;
cout<<"虚函数表地址"<<(int*)*(int*)(&derive)<<endl;
cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&b)<<endl;
cout<<"虚函数表 第一个函数地址"<<(int*)*(int*)*(int*)(&derive)<<endl;
cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&b)+1)<<endl;
cout<<"虚函数表 第二个函数地址"<<(int*)*((int*)*(int*)(&derive)+1)<<endl;
cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&b)+2)<<endl;
cout<<"虚函数表 第三个函数地址"<<(int*)*((int*)*(int*)(&derive)+2)<<endl;
//打印出虚函数内容
pfun = (fun)(int*)*(int*)*(int*)(&derive);//f将父类的f覆盖掉
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+1);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+2);
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+3);//
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&derive)+4);
pfun();
cout<<"直接通过父类指针调用子类实现的函数的话"<<endl;
Base* newBase = new Derived_cover;
newBase->f();
newBase->g();
newBase->h();
}
//测试多重继承的情况,测试一下多重继承的虚函数表的内存分布,应该是有两个虚函数表,
//分别指向base,base2,无覆盖
void test4()
{
cout<<"多重继承的内存分布"<<endl;
multipleDerived myMultiple;
fun pfun = NULL;
cout<<"多重继承的虚函数1地址"<<(int*)*(int*)(&myMultiple)<<endl;
cout<<"多重继承的虚函数2地址"<<(int*)*((int*)(&myMultiple)+1)<<endl;
cout<<"虚函数表1应该是Base函数+子类未被覆盖的函数"<<endl;
pfun = (fun)(int*)*(int*)*(int*)(&myMultiple);//vp1的fun1 base::f()
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+1);//vp1的fun2 base::g()
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+2);//vp1的fun3 base::h()
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+3);//vp1的fun4 multipleDerived::f1()
pfun();
pfun = (fun)(int*)*((int*)*(int*)(&myMultiple)+4);//vp1的fun4 multipleDerived::g1()
pfun();
cout<<"虚函数表2"<<endl;
pfun = (fun)(int*)*(int*)*((int*)(&myMultiple)+1);
pfun();
pfun = (fun)(int*)*((int*)*((int*)(&myMultiple)+1)+1);
pfun();
}
//测试多重继承有覆盖
void test5()
{
cout<<"多重继承有覆盖"<<endl;
multipleDerivedCover d;
Base* d1 = &d;
Base2* d2 = &d;
d1->f();
d2->f();
d1->g();
d2->g();
}
int main()
{
test1();
test2();
test3();
test4();
test5();
return 0;
}