- #include <iostream>
- using namespace std;
- class BB
- {
- public:
- virtual void vfbb()
- {
- cout << "BB::vfbb ..." << endl;
- }
- virtual void vfbb2()
- {
- cout << "BB::vfbb2 ..." << endl;
- }
- int bb_;
- };
- class B1 : virtual public BB
- {
- public:
- virtual void vfb1()
- {
- cout << "B1::vfb1 ..." << endl;
- }
- int b1_;
- };
- class B2 : virtual public BB
- {
- public:
- virtual void vfb2()
- {
- cout << "B2::vfb2 ..." << endl;
- }
- int b2_;
- };
- class DD : public B1, public B2
- {
- public:
- virtual void vfdd()
- {
- cout << "DD::vfdd ..." << endl;
- }
- int dd_;
- };
- typedef void (*FUNC)();
- int main() {
- cout << sizeof(BB) << endl;
- cout << sizeof(B1) << endl;
- cout << sizeof(DD) << endl;
- BB bb;
- long** p;
- p = (long**)&bb; // 根据编译器不同,有时候可以用p = reinterpret_cast<long**>(&bb);转化
- FUNC fun;
- fun = (FUNC)p[0][0]; // 根据编译器不同,有时候可以用reinterpret_cast<FUNC>(p[0][0]);
- fun();
- fun = (FUNC)p[0][1];
- fun();
- cout << endl;
- B1 b1;
- p = (long**)&b1;
- fun = (FUNC)p[0][0];
- fun();
- fun = (FUNC)p[3][0];
- fun();
- fun = (FUNC)p[3][1];
- fun();
- cout << p[1][0] << endl;
- cout << p[1][1] << endl;
- cout << endl;
- DD dd;
- p = (long**)ⅆ
- fun = (FUNC)p[0][0];
- fun();
- fun = (FUNC)p[3][0];
- fun();
- fun = (FUNC)p[7][0];
- fun();
- fun = (FUNC)p[7][1];
- fun();
- cout << p[1][0] << endl;
- cout << p[1][1] << endl;
- cout << p[4][0] << endl;
- cout << p[4][1] << endl;
- cout << endl;
- return 0;
- }
复制代码 代码输出:
总结:
虚继承,里面就会有vbptr这个指针,因为虚继承是为了解决菱形继承中变量的二义性,使派生类中只有一份基类的成员变量,所以需要这个vbptr来记录里面的两个偏移量。
虚函数,里面就会有vptr这个指针,用来指向虚函数。
内存模型:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |