⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atl under the hood - part 2.mht

📁 大家知道wtl是window UI库
💻 MHT
📖 第 1 页 / 共 5 页
字号:
<SPAN class=3Dcpp-keyword>class</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Base() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Base"</SPAN> &lt;&lt; =
endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 3rd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>2</SPAN>) =
&lt;&lt; endl;
cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Base::f1"</SPAN> &lt;&lt; endl; }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f2() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Base::f2"</SPAN> &lt;&lt; endl; }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Drive : <SPAN =
class=3Dcpp-keyword>public</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Drive() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Drive"</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 3rd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>2</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Drive::f1"</SPAN> &lt;&lt; endl; }
};

<SPAN class=3Dcpp-keyword>int</SPAN> main() {
    Drive d;
    <SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>The output of this program is <PRE>In Base
Virtual Pointer =3D 0012FF7C
Address of Vtable =3D 0046C0E0
Value at Vtable 1st entry =3D 004010F0
Value at Vtable 2nd entry =3D <SPAN class=3Dcpp-literal>00401145</SPAN>
Value at Vtable 3rd entry =3D <SPAN class=3Dcpp-literal>00000000</SPAN>

In Drive
Virtual Pointer =3D 0012FF7C
Address of Vtable =3D 0046C0C8
Value at Vtable 1st entry =3D 0040121C
Value at Vtable 2nd entry =3D <SPAN class=3Dcpp-literal>00401145</SPAN>
Value at Vtable 3rd entry =3D <SPAN class=3Dcpp-literal>00000000</SPAN>
</PRE>The output of this program shows that the base class's virtual=20
      function is not overridden in drive class then drive class =
constructor=20
      doesn't do anything with that entry in virtual function.=20
      <P>Now invite pure virtual function in this game too and see the =
behavior=20
      of it. Take a look at the following program=20
      <H3>Program 27</H3><PRE><SPAN class=3Dcpp-preprocessor>#include =
&lt;iostream&gt;</SPAN>
using <SPAN class=3Dcpp-keyword>namespace</SPAN> std;

<SPAN class=3Dcpp-keyword>class</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Base() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Base"</SPAN> &lt;&lt; =
endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() =3D <SPAN =
class=3Dcpp-literal>0</SPAN>;
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f2() =3D <SPAN =
class=3Dcpp-literal>0</SPAN>;
};

<SPAN class=3Dcpp-keyword>class</SPAN> Drive : <SPAN =
class=3Dcpp-keyword>public</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Drive() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Drive"</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Drive::f1"</SPAN> &lt;&lt; endl; }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f2() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Drive::f2"</SPAN> &lt;&lt; endl; }
};

<SPAN class=3Dcpp-keyword>int</SPAN> main() {
    Drive d;

    <SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>The output of this program is little bit different in debug and=20
      release mode. Here is the output of the debug mode <PRE>In Base
Virtual Pointer =3D 0012FF7C
Address of Vtable =3D 0046C0BC
Value at Vtable 1st entry =3D 00420CB0
Value at Vtable 2nd entry =3D 00420CB0

In Drive
Virtual Pointer =3D 0012FF7C
Address of Vtable =3D 0046C0A4
Value at Vtable 1st entry =3D <SPAN class=3Dcpp-literal>00401212</SPAN>
Value at Vtable 2nd entry =3D 0040128F
</PRE>And here is the output in the release Mode <PRE>In Base
Virtual Pointer =3D 0012FF80
Address of Vtable =3D 0042115C
Value at Vtable 1st entry =3D 0041245D
Value at Vtable 2nd entry =3D 0041245D

In Drive
Virtual Pointer =3D 0012FF80
Address of Vtable =3D <SPAN class=3Dcpp-literal>00421154</SPAN>
Value at Vtable 1st entry =3D <SPAN class=3Dcpp-literal>00401310</SPAN>
Value at Vtable 2nd entry =3D <SPAN class=3Dcpp-literal>00401380</SPAN>
</PRE>To better understand change a program little bit and try to call=20
      virtual function from function pointer.=20
      <H3>Program 28</H3><PRE><SPAN class=3Dcpp-preprocessor>#include =
&lt;iostream&gt;</SPAN>
using <SPAN class=3Dcpp-keyword>namespace</SPAN> std;

<SPAN class=3Dcpp-keyword>typedef</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN>(*Fun)();

<SPAN class=3Dcpp-keyword>class</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Base() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Base"</SPAN> &lt;&lt; =
endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
       =20
        <SPAN class=3Dcpp-comment>// try to execute first virtual =
function</SPAN>
        Fun pFun =3D (Fun)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>);
        pFun();

        cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() =3D <SPAN =
class=3Dcpp-literal>0</SPAN>;
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f2() =3D <SPAN =
class=3Dcpp-literal>0</SPAN>;
};

<SPAN class=3Dcpp-keyword>class</SPAN> Drive : <SPAN =
class=3Dcpp-keyword>public</SPAN> Base {
<SPAN class=3Dcpp-keyword>public</SPAN>:
    Drive() {
        cout &lt;&lt; <SPAN class=3Dcpp-string>"In Drive"</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Virtual Pointer =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN> &lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Address of Vtable =3D =
"</SPAN> &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN class=3Dcpp-keyword>this</SPAN> =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 1st =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; <SPAN class=3Dcpp-string>"Value at Vtable 2nd =
entry =3D "</SPAN> &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)<SPAN =
class=3Dcpp-keyword>this</SPAN>+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
        cout &lt;&lt; endl;
    }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f1() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Drive::f1"</SPAN> &lt;&lt; endl; }
    <SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f2() { cout &lt;&lt; <SPAN =
class=3Dcpp-string>"Drive::f2"</SPAN> &lt;&lt; endl; }
};

<SPAN class=3Dcpp-keyword>int</SPAN> main() {
    Drive d;

    <SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>Now the behavior of program is different in debug and release =
Mode.=20
      In Debug mode it display run time error dialog box=20
      <P>
      <CENTER><IMG height=3D188=20

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -