标签:虚继承虚表
虚继承
内存布局:Base1,Base2各自有自己的虚表,因为自己类中有自己的虚函数。
#include<iostream>
using namespace std;
typedef void(*Fun)();
class Base
{
public:
virtual void fun1()
{
cout << "Base::fun1()" << endl;
}
public:
int _b;
};
class Base1 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
virtual void fun3()
{
}
public:
int _b1;
};
class Base2 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
virtual void fun2()
{
}
public:
int _b2;
};
class Derive :public Base1, public Base2
{
public:
virtual void fun1()
{
cout << "Derive::fun1()" << endl;
}
public:
int _d;
};
void PrintVTable(int *ptr)
{
for (int i = 0; ptr[i] != 0; ++i)
{
Fun f = (Fun)ptr[i];
f();
}
}
int main()
{
Derive b1;
b1._b1 = 2;
b1.Base1::_b = 1;
b1._b2 = 3;
b1._d = 4;
/*int *p1=(int *)(*(int*)&b1);
PrintVTable(p1);
cout<<sizeof(Base1)<<endl;
int *p2=(int*)(*(int*)((int)&b1+sizeof(Base1)));
PrintVTable(p2);*/
system("pause");
return 0;
}2.子类中有虚函数,所以父类中必须创建虚表指针
class Base1 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
public:
int _b1;
};
class Base2 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
public:
int _b2;
};
class Derive :public Base1, public Base2
{
public:
virtual void fun1()
{
cout << "Derive::fun1()" << endl;
}
virtual void fun2()
{
}
public:
int _d;
};
3.父类中无虚函数,在子类中创建虚表指针
class Base
{
public:
public:
int _b;
};
class Base1 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base1::fun1()" << endl;
}
public:
int _b1;
};
class Base2 :virtual public Base
{
public:
virtual void fun1()
{
cout << "Base2::fun1()" << endl;
}
public:
int _b2;
};
class Derive :public Base1, public Base2
{
public:
virtual void fun1()
{
cout << "Derive::fun1()" << endl;
}
virtual void fun2()
{
}
public:
int _d;
};
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1722157
标签:虚继承虚表
原文地址:http://10541556.blog.51cto.com/10531556/1722157