• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            JACKY_ZZ[貓貓愛吃魚]

            春風(fēng)拂面兩頰紅,秋葉灑地一片金。 夏荷搖曳一身輕,冬雪覆蓋大地銀。
            posts - 30, comments - 123, trackbacks - 0, articles - 0

            VC++/G++ 多態(tài)測試

            Posted on 2019-11-28 11:05 jacky_zz 閱讀(184) 評論(0)  編輯 收藏 引用
            base.h
             1 #ifndef BASE_H
             2 #define BASE_H
             3 
             4 #include <stdio.h>
             5 
             6 class Base
             7 {
             8 public:
             9     Base(int val) : m_val(val)
            10     {
            11         printf("Base::Base(int val) @ 0x%08X\n"this);
            12     }
            13 
            14     virtual void say()
            15     {
            16         printf("void Base::say() @ 0x%08X\n"this);
            17         printf("val = %d\n", GetVal());
            18     }
            19 
            20     virtual ~Base()
            21     {
            22         printf("Base::~Base() @ 0x%08X\n"this);
            23     }
            24 
            25 protected:
            26     int GetVal() { return m_val; }
            27 
            28 private:
            29     int m_val;
            30 };
            31 
            32 #endif
            child.h
             1 #ifndef CHILD_H
             2 #define CHILD_H
             3 
             4 #include <stdio.h>
             5 #include "base.h"
             6 
             7 class Child : public Base
             8 {
             9 public:
            10     Child(int val) : Base(val)
            11     {
            12         printf("Child::Child(int val) @ 0x%08X\n"this);
            13     }
            14 
            15     void say()
            16     {
            17         printf("void Child::say() @ 0x%08X\n"this);
            18         printf("val = %d\n", GetVal());
            19     }
            20 
            21     ~Child()
            22     {
            23         printf("Child::~Child() @ 0x%08X\n"this);
            24     }
            25 };
            26 
            27 #endif
            28 
            main.cpp
              1 #include "base.h"
              2 #include "child.h"
              3 
              4 static void test0();
              5 static void test();
              6 static void virfunc_call(Base *base);
              7 
              8 void test0()
              9 {
             10     int src = 1;
             11     int dst;   
             12 
             13 #ifdef WIN32
             14     dst = src;
             15 #else
             16     asm ("mov %1, %0\n\t"
             17         "add $1, %0"
             18         : "=r" (dst) 
             19         : "r" (src));
             20 #endif
             21 
             22     printf("dst=%d\n", dst);
             23 }
             24 
             25 void test(Base *base)
             26 
             27     int addr = 0;
             28 
             29 #ifdef WIN32
             30     printf("[1] addr=0x%08X base=0x%P\n", addr, base);
             31 #else
             32     printf("[1] addr=0x%08X base=0x%08X\n", addr, base);
             33 #endif
             34 
             35 #ifdef WIN32
             36     addr = *((int *)base);
             37 #else
             38     asm (
             39         "movl %0, %1\n\t"
             40         : "=r" (addr)
             41         : "r" (base)
             42     );
             43 #endif
             44 
             45 #ifdef WIN32
             46     printf("[2] addr=0x%08X base=0x%P\n", addr, base);
             47 #else
             48     printf("[2] addr=0x%08X base=0x%08X\n", addr, base);
             49 #endif
             50 }
             51 
             52 static void virfunc_call(Base *base)
             53 {
             54     typedef void (*FUNC)();
             55 
             56     int *pAddrBase = (int *)base;
             57     int addr = *(int *)base;
             58     int *pVirtualFuncBase = (int *)(*pAddrBase);
             59 
             60 #ifdef WIN32
             61     printf("\nvirfunc=0x%P\npAddrBase=0x%P\npVirtualFuncBase=0x%P\n\n", virfunc_call, pAddrBase, pVirtualFuncBase);
             62 #else
             63     printf("\nvirfunc=0x%08X\npAddrBase=0x%08X\npVirtualFuncBase=0x%08X\n\n", virfunc_call, pAddrBase, pVirtualFuncBase);
             64 #endif
             65 
             66     FUNC func = reinterpret_cast<FUNC>(*pVirtualFuncBase);
             67 
             68 #ifdef WIN32
             69     __asm {
             70         mov ecx, base
             71     }
             72 #else
             73     __asm__ __volatile__(
             74         "movl %0, %%ecx"
             75         :
             76         : "r" (base)
             77         :
             78     );
             79 #endif
             80 
             81     func();
             82 }
             83 
             84 int main(int argc, char *argv[])
             85 {
             86     Base *base1 = nullptr, *base2 = nullptr;
             87 
             88     base1 = new Base(1);
             89     // base1->say();
             90     virfunc_call(base1);
             91     // test(base1);
             92     delete base1;
             93 
             94     base2 = new Child(2);
             95     // base2->say();
             96     virfunc_call(base2);
             97     // test(base2);
             98     delete base2;
             99 
            100     return 0;
            101 }


            VC++
            cl /DWIN32 main.cpp


            G++
            g++ -o main main.cpp
            青青青青久久精品国产h久久精品五福影院1421 | 久久久久久久亚洲Av无码| 久久国产欧美日韩精品| 亚洲va久久久噜噜噜久久天堂| 久久久久亚洲AV成人片| 91亚洲国产成人久久精品网址| 久久国产三级无码一区二区| 一本大道久久香蕉成人网| 久久人爽人人爽人人片AV | 伊人久久大香线蕉综合热线| 亚洲AV无码1区2区久久| 狠狠人妻久久久久久综合蜜桃 | 亚洲欧洲久久av| 国产欧美久久久精品| 99久久这里只精品国产免费 | 波多野结衣久久一区二区| 2022年国产精品久久久久| 久久国产亚洲精品| 99久久精品国产一区二区| 久久久久亚洲AV片无码下载蜜桃| 久久精品无码一区二区三区日韩 | 老男人久久青草av高清| 91精品婷婷国产综合久久| 久久99精品国产麻豆| 久久久久久久久66精品片| 久久99国产精品成人欧美| 91精品国产综合久久久久久| 国内精品综合久久久40p| 亚洲欧美国产精品专区久久| 久久久久一本毛久久久| 久久播电影网| 久久九九免费高清视频| 青青草原综合久久大伊人精品| 精品国产VA久久久久久久冰| 久久亚洲精品中文字幕| 国产偷久久久精品专区| 一本一本久久aa综合精品| 久久99精品久久久大学生| 成人综合久久精品色婷婷| 伊人久久大香线焦AV综合影院 | 久久久久免费视频|