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

📄 multiinheritance2.html

📁 关于 C++ 的历史无须我来介绍了
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

  
  <link rel="stylesheet" href="css/stdlayout.css" type="text/css">

  
  <link rel="stylesheet" href="css/print.css" type="text/css">

  
  <meta content="text/html; charset=gb2312" http-equiv="content-type">

  
  <title>多重继承(二)</title>
</head>


<body>

<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>

<h1><a href="CppGossip.html">C++
Gossip:&nbsp;多重继承(二)</a></h1>

多重继承时通常其中一个基底类别作为private实作体,而其它的用以表现完全的抽象介面。<br>

<br>
考虑您有一个方法doRequest(),您事先并无法知道什么型态的物件会被传进来,或者是这个方法可以接受任何类型的物件,您想要操作物件上的某个特
定方法,例如doSomething()方法,问题是传进来的物件是任意的,除非您定义一个抽象类别并宣告doSomething()抽象方法,然后让所
有的类别都继承这个抽象类别,否则的话您的doRequest()方法似乎无法实作出来,实际上这么作也没有价值。<br>
<br>
您可以藉由多重继承来解决这个问题,例如先定义一个抽象类别:<br>
<ul>
  <li>IRequest.h</li>
</ul>

<pre>#ifndef IREQUEST<br>#define IREQUEST<br><br>class IRequest {<br>public:<br>    virtual void execute() = 0;<br>};<br><br>#endif</pre>


<span class="postbody"><br>
假设您的类别是以下的SomeObject类别的子类别:<br>
</span>
<ul>
  <li>SomeObject.h</li>
</ul>

<pre>#ifndef SOMEOBJECT<br>#define SOMEOBJECT<br><br>#include &lt;iostream&gt;<br>using namespace std;<br><br>class SomeObject {<br>public:<br>    virtual void someFunction() {<br>        cout &lt;&lt; "do something" &lt;&lt; endl;<br>    }<br><br>private:<br>    void otherFunction() {<br>         cout &lt;&lt; "do other" &lt;&lt; endl;<br>    }<br>};<br><br>#endif<br></pre>


<span class="postbody"><br>
</span>为了满足之前所提供的doRequest()的需求,您让衍生类别同时继承IRequest与SomeObject类别,例如:<br>
<ul>
  <li>Welcome.h</li>
</ul>

<pre>#include "IRequest.h"<br>#include "SomeObject.h"<br>#include &lt;iostream&gt;<br>using namespace std;<br><br>class Welcome : public SomeObject, public IRequest {<br>public:<br>    void execute() {<br>         cout &lt;&lt; "Welcome!!" &lt;&lt; endl;<br>    }<br>};</pre>


<span class="postbody"></span>
<ul>
  <li>Hello.h</li>
</ul>

<pre>#include "IRequest.h"<br>#include "SomeObject.h"<br>#include &lt;iostream&gt;<br>using namespace std;<br><br>class Hello : public SomeObject, public IRequest {<br>public:<br>    void execute() {<br>         cout &lt;&lt; "Hello!!" &lt;&lt; endl;<br>    }<br>};</pre>


<span class="postbody"></span><br>
<span class="postbody">假设您设计了一个doRequest()方法,虽然不知道Hello与Welcome是什么型态,但它们
都继承了IRequest,所以doRequest()只要知道IRequest定义了什么公开介面,就可以操作Hello与Welcome的实例,而不
用知道传入的物件到底是什么类别的实例,使用下面这个程式来测试:<br>
</span>
<ul>
  <li>main.cpp</li>
</ul>

<pre>#include &lt;iostream&gt; <br>#include "IRequest.h"<br>#include "Welcome.h"<br>#include "Hello.h"<br>using namespace std; <br><br>void doRequest(IRequest *request) {<br>     request-&gt;execute();<br>}<br><br>int main() { <br>    Welcome welcome;<br>    Hello hello;<br>    <br>    doRequest(&amp;welcome);<br>    doRequest(&amp;hello);<br>    <br>    return 0;<br>}</pre>
<span class="postbody"><br>
执行结果:</span><br>

<table style="text-align: left; width: 100%;" border="0" cellpadding="2" cellspacing="2">

  <tbody>

    <tr>

      <td style="background-color: rgb(0, 0, 0);"><small><span style="color: rgb(255, 255, 255);">Welcome!!<br>
Hello!!</span></small><span style="color: rgb(255, 255, 255);"><br>

      </span></td>

    </tr>

  
  </tbody>
</table>

<br>
<br>
<br>

</body>
</html>

⌨️ 快捷键说明

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