📄 multiinheritance2.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: 多重继承(二)</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 <iostream><br>using namespace std;<br><br>class SomeObject {<br>public:<br> virtual void someFunction() {<br> cout << "do something" << endl;<br> }<br><br>private:<br> void otherFunction() {<br> cout << "do other" << 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 <iostream><br>using namespace std;<br><br>class Welcome : public SomeObject, public IRequest {<br>public:<br> void execute() {<br> cout << "Welcome!!" << endl;<br> }<br>};</pre>
<span class="postbody"></span>
<ul>
<li>Hello.h</li>
</ul>
<pre>#include "IRequest.h"<br>#include "SomeObject.h"<br>#include <iostream><br>using namespace std;<br><br>class Hello : public SomeObject, public IRequest {<br>public:<br> void execute() {<br> cout << "Hello!!" << 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 <iostream> <br>#include "IRequest.h"<br>#include "Welcome.h"<br>#include "Hello.h"<br>using namespace std; <br><br>void doRequest(IRequest *request) {<br> request->execute();<br>}<br><br>int main() { <br> Welcome welcome;<br> Hello hello;<br> <br> doRequest(&welcome);<br> doRequest(&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 + -