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

📄 9002.htm

📁 C++细节解释
💻 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:#40 多态控制.
</title>
</HEAD>
<BODY>
<center>

<div align=center><div class=fst align=left><div class=fstdiv3 id=print2>
<font color="#000000" size="4"><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
Guru of the Week:#40 多态控制</b></font><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>#40 多态控制.</b></font></p> 
<p><b>难度:</b>8/10</p> 
<p>is-a型多态是非常有用的工具,但有时你必需限制使用它们,并确定在哪些代码中使用可靠的类多态。本期的gotw将给你一个示例,显示如何获得指定的效果。</p> 
<p><b>问题:</b></p> 
<p>1.思虑以下代码:</p><pre>  class base {
  public:
    virtual void virtfunc();
    // ...
  };

  class derived : public base {
  public:
    void virtfunc();
    // ...
  };

  void somefunc( const base&amp; );</pre> 
<p>以下有两个其它函数:目标是允许f1的参数中的基类中期待使用派生对象的多态形为,然而,要防止在其它函数(包含f2)里工作。</p><pre>  void f1() {
    derived d;
    somefunc( d ); // 正常工作, ok
  }

  void f2() {
    derived d;
    somefunc( d ); // 我们要防止这种情形
  }</pre> 
<p>示范如何做到这个效果。</p> 
<p><b>解决方法:</b></p> 
<p><font color=#999933>1.思虑以下代码:</font></p><pre><font color=#999933>  class base {
  public:
    virtual void virtfunc();
    // ...
  };

  class derived : public base {
  public:
    void virtfunc();
    // ...
  };

  void somefunc( const base&amp; );</font></pre> 
<p>这儿有个前提:为什么所有代码中使用基类来期待使用派生类对象呢?,是因为派生类是从基类进行public继承过来的(这儿没有奇怪的地方).</p> 
<p>如果替代的方法:派生类从基类进行private继承,当“几乎”没有代码使用派生类当作基类看待的时候,这个“几乎”的前提是代码只能存取到派生类对象的private部分与存取到从基类中派生的基类的private部分;因此,在基类的地方使用派生类的多态是正常的。通常,只有派生类的成员函数有这样的存取权限,然而,我们使用了“friend”来扩展相似的存取功能到外部代码中。</p> 
<p>把提出的每一部分集合起来,我们就获得:</p> 
<p><font color=#999933>以下有两个其它函数:目标是允许f1的参数中的基类中期待使用派生对象的多态形为,然而,要防止在其它函数(包含f2)里工作。</font></p><pre><font color=#999933>  void f1() {
    derived d;
    somefunc( d ); // works, ok
  }

  void f2() {
    derived d;
    somefunc( d ); // we want to prevent this
  }</font></pre> 
<p><font color=#999933>示范如何做到这个效果。</font></p> 
<p>我们的回答是:</p><pre>  class derived : private base {
  public:
    void virtfunc();
    // ...
    friend void f1();
  };</pre> 
<p>这种方式利索地解决了这个问题,然而,它比起原始版本里的f1,它给予f1更大的权限<br> 
</p> 
</DIV></div></div> 
 
</center></BODY></HTML> 

⌨️ 快捷键说明

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