zoukankan      html  css  js  c++  java
  • C++对象内存布局⑩GCC编译器虚拟继承菱形继承

    C++对象内存布局--⑩GCC编译器--虚拟继承--菱形继承

    //GCC编译器--虚拟继承--菱形继承.cpp
    //2010.8.19
    //GCC编译器
    #include <iostream>
    using namespace std;
    ////////////////////////////////////////////////////////////////
    class Base
    {
        public:
            Base(int a = 10):a(a)
            {
            }
            virtual void show()
            {
                cout << "Base::show()" << "\t" << a << endl;
            }
            virtual void testA()
            {
                cout << "Base::testA()" << "\t" << a << endl;
            }
        private:
            int a;
    };
    ////////////////////////////////////////////////////////////////
    class BaseA : virtual public Base
    {
        public:
            BaseA(int b = 20):b(b)
            {
            }
            virtual void showA()
            {
                cout << "BaseA::showA()" << "\t" << b << endl;
            }
            void testA()
            {
                cout << "BaseA::testA()" << "\t" << b << endl;
            }
        private:
            int b;
    };
    ////////////////////////////////////////////////////////////////
    class BaseB : virtual public Base
    {
        public:
            BaseB(int c = 30):c(c)
            {
            }
            virtual void showB()
            {
                cout << "BaseB::showB()" << "\t" << c << endl;
            }
        private:
            int c;
    };
    ////////////////////////////////////////////////////////////////
    class Derived : public BaseA, public BaseB
    {
        public:
            Derived(int d = 40):d(d)
            {
            }
            virtual void show()
            {
                cout << "Derived::show()" << "\t" << d << endl;
            }
            virtual void test()
            {
                cout << "Derived::test()" << "\t" << d << endl;
            }
        private:
            int d;
    };
    ////////////////////////////////////////////////////////////////
    int main()
    {
        Derived obj;
        int** p = (int**)&obj;
        cout << "Derived obj 内存布局:" << endl;
        for (int i = 0; i != sizeof(obj)/4; ++i)
        {
            cout << p[i] << endl;
        }
        cout << endl;
       typedef void (*fun)(void*pThis);//非常重要
    	/*通过虚函数表调用函数*/
    	/*第一个虚函数表指针。BaseA*/
    	((fun)(p[0][0]))(p);
    	((fun)(p[0][1]))(p);//头两个是BaseA的
    
    	((fun)(p[0][2]))(p);
    	((fun)(p[0][3]))(p);//后两个是Derived的
    	/*第二个虚函数表指针。BaseB*/
    	cout << endl;
    	((fun)(p[2][0]))(p+2);
    	/*第三个虚函数表指针。Base*/
        cout << endl;
    	((fun)(p[5][0]))(p+5);
    	((fun)(p[5][1]))(p+5);
        return 0;
    }
    /*
    Derived obj 内存布局:
    0x472d0c
    0x14
    0x472d28
    0x1e
    0x28
    0x472d3c
    0xa
    
    BaseA::showA()  20
    BaseA::testA()  20
    Derived::show() 40
    Derived::test() 40
    
    BaseB::showB()  30
    
    Derived::show() 40
    BaseA::testA()  20
    */
    
  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/cswuyg/p/1804108.html
Copyright © 2011-2022 走看看