选择显示字体大小

c++箴言:谨慎使用多继承


  触及 multiple inheritance (mi)(多继承)的时候,c++ 社区就会鲜明地分裂为两个基本的阵营。一个阵营认为如果 single inheritance (si)(单继承)是有好处的,multiple inheritance(多继承)一定更有好处。另一个阵营认为 single inheritance(单继承)有好处,但是多继承引起的麻烦使它得不偿失。在本文中,我们的主要目的是理解在 mi 问题上的这两种看法。

  首要的事情之一是要承认当将 mi 引入设计领域时,就有可能从多于一个的 base class(基类)中继承相同的名字(例如,函数,typedef,等等)。这就为歧义性提供了新的时机。例如:

class borrowableitem { // something a library lets you borrow
public:
 void checkout(); // check the item out from the library
 ..
};

class electronicgadget {
private:
 bool checkout() const; // perform self-test, return whether
 ... // test succeeds
};

class mp3player: // note mi here
public borrowableitem, // (some libraries loan mp3 players)
public electronicgadget
{ ... }; // class definition is unimportant

mp3player mp;

mp.checkout(); // ambiguous! which checkout?

  注意这个例子,即使两个函数中只有一个是可访问的,对 checkout 的调用也是有歧义的。(checkout 在 borrowableitem 中是 public(公有)的,但在 electronicgadget 中是 private(私有)的。)这与 c++ 解析 overloaded functions(重载函数)调用的规则是一致的:在看到一个函数的是否可访问之前,c++ 首先确定与调用匹配最好的那个函数。只有在确定了 best-match function(最佳匹配函数)之后,才检查可访问性。这目前的情况下,两个 checkouts 具有相同的匹配程度,所以就不存在最佳匹配。因此永远也不会检查到 electronicgadget::checkout 的可访问性。

  为了消除歧义性,你必须指定哪一个 base class(基类)的函数被调用:

mp.borrowableitem::checkout(); // ah, that checkout...

  当然,你也可以尝试显式调用 electronicgadget::checkout,但这样做会有一个 "you're trying to call a private member function"(你试图调用一个私有成员函数)错误代替歧义性错误。

  multiple inheritance(多继承)仅仅意味着从多于一个的 base class(基类)继承,但是在还有 higher-level base classes(更高层次基类)的 hierarchies(继承体系)中出现 mi 也并不罕见。这会导致有时被称为 "deadly mi diamond"(致命的多继承菱形)的后果。

class file { ... };
class inputfile: public file { ... };
class outputfile: public file { ... };
class iofile: public inputfile,
public outputfile
{ ... };

 asp?p=/2006-5-10/8296025ye74_1.gif" border="0" alt="c++箴言:谨慎使用多继承" />


 


关键字 本文所属关键字

  • vb  c++  

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范