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

📄 10.2.2b.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 HTM
字号:
<html>

<head>
<title>编译原理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link type="text/css" rel="stylesheet" href="../css/specification.css">
</head>

<body>

<table align="right" width="300">
  <tr>
    <td>
    <img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.2.2.htm'" ></imag></td>
    <td>
    <img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.2.2c.htm'" ></imag></td>
  </tr>
</table>

<p> </p>
 <table><tr><td>&nbsp&nbsp&nbsp&nbsp</td>
<td class="content">
<p>
<font class = "emphasize">动态方法</font>
</p>
<p>
		动态方法是指在编译时无法确定下来执行函数体,要到运行时根据变量指向的实际类型来确定的方法。与静态方法相反,编译出的机器代码不是依据变量的类型来定的,而是依据变量所指向的对象类型来定的。在c++中用带有virtual关键字的虚函数来表示。显然,上述的编译技术对动态方法的编译是不适合的。例如在程序10.4中,类A中的方法f是一个动态方法,它在类C的子类D中被覆盖。这样当我们同样调用c.f()时,我们没有办法在编译时确定变量c指向的类型是D还是C,因而也就无法确定应该编译成机器标号D_f,还是A_f。
</p>
<p>
为了解决这个问题,要在类描述符中增加一个<font class = "definition2">
动态方法表</font>(在c++中也称为<font class = "definition2">虚函数表</font>),这个表记录了每个动态方法对应的机器标号。当类B从类A派生出来以后,它的动态方法表首先包含A中已有的方法,然后才是自己新增的动态方法。这很像我们前面提到的属性继承的安排方式。图10.5显示了程序10.4对应的动态方法表。可见,尽管方法f的机器标号在类D和类A中都位于表的第一项,但它们却有不同的标号,这是因为f在类D中被覆盖了。
</p>
<center><img src="images/10.5.gif"></center>
</td></tr></table>
<br>
<p> </p>

<table align="right" width="300">
  <tr>
    <td>
    <img src="../images/previous.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.2.2.htm'" ></imag></td>
    <td>
    <img src="../images/next.gif" onmouseover="javascript:style.cursor='hand'"
    onclick="vbscript:window.location.href='10.2.2c.htm'" ></imag></td>
  </tr>
</table>
</body>
</html>

⌨️ 快捷键说明

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