📄 9001.htm
字号:
<HTML>
<HEAD>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<style >
.fst{padding:0px 15px;width:770px;border-left:0px solid #000000;border-right:0px solid #000000}
.fstdiv3 img{border:0px;border-right:8px solid #eeeecc;border-top:6px solid #eeeecc}
</style>
<title>
Guru of the Week:#39 多重继承 Ⅲ.
</title>
</HEAD>
<BODY>
<center>
<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<p><font color="#000000" size="4"><b>
Guru of the Week:#39 多重继承 </b></font></p>
<p>/*此文是译者出于自娱翻译的gotw(guru of the week:http://www.gotw.ca/gotw/index.htm)系列文章的一篇,原文的版权是属于hub sutter(著名的c++专家,《exceptional c++》的作者)。此文的翻译没有征得原作者的同意,只供学习讨论。——译者:黄森堂*/</p>
<p><font color=#0000ff size=4><b>#39 多重继承 ⅲ.</b></font></p>
<p><b>难度:</b>4/10</p>
<p>覆盖继承来的虚函数是很容易 -- 只要你不要在具有相同特征(原文:signature)的两个基类里尝试覆盖里面的虚函数,当基类来自不同的供应商的时候就可能发生!</p>
<p><b>问题:</b></p>
<p>1.思考以下两个类:</p><pre> class b1 {
public:
virtual int readbuf( const char* );
// ...
};
class b2 {
public:
virtual int readbuf( const char* );
// ...
};</pre>
<p>它们都是在基类中明显地使用,但它们不以其它发生关系,它们的readbuf函数是在做不同的事,且类是由不同的供应商提供的不同的库。</p>
<p>示范:如何写一个类d,该类公共派生于b1与b2(class d:public b1,public b2),并且重载readbufs来做不同的事情.</p>
<p><b>解决方法:</b></p>
<p><font color=#999933>示范:如何写一个类d,该类公共派生于b1与b2(class d:public b1,public b2),并且重载readbufs来做不同的事情.</font></p>
<p>以下代码是天真的想法,它不能工作:</p><pre> class d : public b1, public b2 {
public:
int readbuf( const char* );
// overrides both b1::readbuf and b2::readbuf
};</pre>
<p>这个覆盖两个函数,例它们具有相同的实现,然面,问题的要点是覆盖这两个函数来做不同的事,你不能仅仅在d::readbuff里面依赖对它的调用来"转变"行为,因为当你深入d::readbuf内部时,那儿绝对不会告诉你基本接口已经使用了。</p>
<h4>更改虚函数名</h4>
<p>如果两个继承过来的函数是具有不同的特征(原文:signature),那么这儿就没有问题:像通常一样,我们仅仅需要覆盖它们,如果出现前面所说的情形,只能通过改变函数名来做到最小的改变。</p>
<p>习惯的做法是更改基类函数的署名来创建从基类派生的中间类,定义新的虚函数,并覆盖继承过来的版本且调用新的函数:</p><pre> class d1 : public b1 {
public:
virtual int readbufb1( const char* p ) = 0;
int readbuf( const char* p ) // 覆盖继承过来的函数
{ return readbufb1( p ); } // 调用新的函数
};
class d2 : public b2 {
public:
virtual int readbufb2( const char* p ) = 0;
int readbuf( const char* p ) // 覆盖继承过来的函数
{ return readbufb2( p ); } // 调用新的函数
};</pre>
<p>d1与d2可能也需要复制b1与b2的构造器,那d就可以调用它们,但这儿请注意:d1与d2是抽象类,所以它们不需要复制任何的b1与b2的函数与重载符、赋值运算符等:</p>
<p>现在我们可以简单地写:</p><pre> class d : public d1, public d2 {
public:
int readbufb1( const char* );
int readbufb2( const char* );
};</pre>
<p>派生类只需要知道它们不必覆盖readbuf函数。<br>
</p>
</DIV></div></div>
</center></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -