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

📄 atl under the hood - part 1.mht

📁 大家知道wtl是window UI库
💻 MHT
📖 第 1 页 / 共 5 页
字号:

		&lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>) &lt;&lt; endl;

	cout &lt;&lt; endl &lt;&lt; "Information about VTable" &lt;&lt; endl =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 1st entry of VTable "=20
		&lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 2nd entry of VTable "=20
		&lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
=09
	<SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>
      <P>The output of this program is </P><PRE>Address of <SPAN =
class=3Dcpp-keyword>virtual</SPAN> pointer 0012FF7C
Value at <SPAN class=3Dcpp-keyword>virtual</SPAN> pointer i.e. Address =
of <SPAN class=3Dcpp-keyword>virtual</SPAN> table 0046C0EC

Information about VTable

Value at 1st entry of VTable 0040100A
Value at 2nd entry of VTable 0040129E
</PRE>
      <CENTER><IMG height=3D131=20
      src=3D"http://www.codeproject.com/atl/ATL_UnderTheHood_/CPP3.GIF"=20
      width=3D400></CENTER><BR>Now one question naturally comes in the =
mind. How=20
      does the compiler know the length of the vtable? The answer is the =
last=20
      entry of vtable is NULL. Change a program little bit to get an =
idea of=20
      this.=20
      <H3>Program 12.</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> Class {
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { cout &lt;&lt; "Class::f" &lt;&lt; =
endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> g() { cout &lt;&lt; "Class::g" &lt;&lt; =
endl; }
};

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

	cout &lt;&lt; "Address of <SPAN class=3Dcpp-keyword>virtual</SPAN> =
pointer " &lt;&lt; (<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>) &lt;&lt; endl;
	cout &lt;&lt; "Value at <SPAN class=3Dcpp-keyword>virtual</SPAN> =
pointer i.e. Address of <SPAN class=3Dcpp-keyword>virtual</SPAN> table " =

		 &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>) &lt;&lt; endl;

	cout &lt;&lt; endl &lt;&lt; "Information about VTable" &lt;&lt; endl =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 1st entry of VTable "=20
		 &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>) =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 2nd entry of VTable "=20
		 &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>) =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 3rd entry of VTable "=20
		 &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>2</SPAN>) =
&lt;&lt; endl;
	cout &lt;&lt; "Value at 4th entry of VTable "=20
		 &lt;&lt; (<SPAN class=3Dcpp-keyword>int</SPAN>*)*((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>3</SPAN>) =
&lt;&lt; endl;

	<SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>
      <P>The output of this program is </P><PRE>Address of <SPAN =
class=3Dcpp-keyword>virtual</SPAN> pointer 0012FF7C
Value at <SPAN class=3Dcpp-keyword>virtual</SPAN> pointer i.e. Address =
of <SPAN class=3Dcpp-keyword>virtual</SPAN> table 0046C134

Information about VTable

Value at 1st entry of VTable 0040100A
Value at 2nd entry of VTable 0040129E
Value at 3rd entry of VTable <SPAN class=3Dcpp-literal>00000000</SPAN>
Value at 4th entry of VTable 73616C43
</PRE>
      <P>Output of this program shows that the last entry of vtable is =
NULL.=20
      Let's call virtual function from the knowledge we have.=20
      <CENTER><IMG height=3D170=20
      src=3D"http://www.codeproject.com/atl/ATL_UnderTheHood_/CPP4.GIF"=20
      width=3D400></CENTER>
      <H3>Program 13.</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> Class {
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { cout &lt;&lt; "Class::f" &lt;&lt; =
endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> g() { cout &lt;&lt; "Class::g" &lt;&lt; =
endl; }
};

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

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

	Fun pFun =3D NULL;

	<SPAN class=3Dcpp-comment>// calling 1st virtual function</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>);
	pFun();
=09
	<SPAN class=3Dcpp-comment>// calling 2nd virtual function</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)(&amp;objClass+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>);
	pFun();

	<SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>
      <P>The output of this program is </P><PRE>Class::f
Class::g
</PRE>
      <P>Now let's see the case of multiple inheritance. Let's see the =
simple=20
      case of multiple inheritances=20
      <H3>Program 14.</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> Base1 {
<SPAN class=3Dcpp-keyword>public</SPAN>:
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Base2 {
<SPAN class=3Dcpp-keyword>public</SPAN>:
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Base3 {
<SPAN class=3Dcpp-keyword>public</SPAN>:
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Drive : <SPAN =
class=3Dcpp-keyword>public</SPAN> Base1, <SPAN =
class=3Dcpp-keyword>public</SPAN> Base2, <SPAN =
class=3Dcpp-keyword>public</SPAN> Base3 {
};

<SPAN class=3Dcpp-keyword>int</SPAN> main() {
	Drive objDrive;
	cout &lt;&lt; "Size is =3D " &lt;&lt; <SPAN =
class=3Dcpp-keyword>sizeof</SPAN>(objDrive) &lt;&lt; endl;
	<SPAN class=3Dcpp-keyword>return</SPAN> <SPAN =
class=3Dcpp-literal>0</SPAN>;
}
</PRE>
      <P>The output of this program is </P><PRE>Size is =3D <SPAN =
class=3Dcpp-literal>12</SPAN>
</PRE>
      <P>This program shows when you drive class with more then one base =
class=20
      then drive class have virtual pointer of all of base classes.=20
      <P>
      <CENTER><IMG height=3D145=20
      src=3D"http://www.codeproject.com/atl/ATL_UnderTheHood_/CPP5.GIF"=20
      width=3D241></CENTER><BR>And what happen when drive class also =
have virtual=20
      function. Lets see this program to better understand the concepts =
of=20
      virtual function with multiple inheritance.
      <P></P>
      <H3>Program 15.</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> Base1 {
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { cout &lt;&lt; "Base1::f" &lt;&lt; =
endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> g() { cout &lt;&lt; "Base1::g" &lt;&lt; =
endl; }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Base2 {
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { cout &lt;&lt; "Base2::f" &lt;&lt; =
endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> g() { cout &lt;&lt; "Base2::g" &lt;&lt; =
endl; }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Base3 {
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> f() { cout &lt;&lt; "Base3::f" &lt;&lt; =
endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> g() { cout &lt;&lt; "Base3::g" &lt;&lt; =
endl; }
};

<SPAN class=3Dcpp-keyword>class</SPAN> Drive : <SPAN =
class=3Dcpp-keyword>public</SPAN> Base1, <SPAN =
class=3Dcpp-keyword>public</SPAN> Base2, <SPAN =
class=3Dcpp-keyword>public</SPAN> Base3 {
<SPAN class=3Dcpp-keyword>public</SPAN>:
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> fd() { cout &lt;&lt; "Drive::fd" =
&lt;&lt; endl; }
	<SPAN class=3Dcpp-keyword>virtual</SPAN> <SPAN =
class=3Dcpp-keyword>void</SPAN> gd() { cout &lt;&lt; "Drive::gd" =
&lt;&lt; endl; }
};

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

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

	Fun pFun =3D NULL;

	<SPAN class=3Dcpp-comment>// calling 1st virtual function of =
Base1</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>);
	pFun();
=09
	<SPAN class=3Dcpp-comment>// calling 2nd virtual function of =
Base1</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 1st virtual function of =
Base2</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>1</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 2nd virtual function of =
Base2</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>1</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 1st virtual function of =
Base3</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>2</SPAN>)+<SPAN class=3Dcpp-literal>0</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 2nd virtual function of =
Base3</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>2</SPAN>)+<SPAN class=3Dcpp-literal>1</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 1st virtual function of =
Drive</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>2</SPAN>);
	pFun();

	<SPAN class=3Dcpp-comment>// calling 2nd virtual function of =
Drive</SPAN>
	pFun =3D (Fun)*((<SPAN class=3Dcpp-keyword>int</SPAN>*)*(<SPAN =
class=3Dcpp-keyword>int</SPAN>*)((<SPAN =
class=3Dcpp-keyword>int</SPAN>*)&amp;objDrive+<SPAN =
class=3Dcpp-literal>0</SPAN>)+<SPAN class=3Dcpp-literal>3</SPAN>);
	pFun();

⌨️ 快捷键说明

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