有哪位高手給詳細講解一下C++裏多態繼承的問題(或曰菱形問題)

來源: 難割難舍中國心 2011-03-16 02:09:08 [] [博客] [舊帖] [給我悄悄話] 本文已被閱讀: 次 (3017 bytes)

大家都知道C++有個多態繼承(multi-inheritance)的問題,或曰菱形問題。而Java引入Interface後徹底擺脫了多態繼承的困擾。

可在下是在才疏學淺,對一些核心問題不甚了了,而一些專業書籍在一些關鍵問題上往往閃爍其辭,所以我懷疑那些偽專家們對此也是一知半解,因而顧左右而言他。

我最不明白的一點是:為什麽多態繼承問題隻出現在method上,而variable沒有這種問題?有人可能會說method有override功能,而variable沒有。可我要告訴你:經過鄙人的細心研究,發現無論是在C++還是在Java裏,真正的override並不存在。也就是說,所以來自parent class的變量和函數全部都要無條件地在child class裏繼承。而所謂的override隻不過是child class又提供了一個同名同參數同返回值的函數而已,但我可以告訴你這兩個同名同參數同返回值的函數是並存的,且完全獨立的。

這裏我再順便糾正一個錯誤概念:許多人認為private的變量和函數是不被繼承的。此大謬也!實際上,private的變量不僅能被原封不動地繼承,而且還將傳之於子孫萬代!其實,所有的variables和methods都將被原封不動地繼承並被傳給子孫萬代。因為這才是OOP下父子class之間真實的general與special的關係。隻不過,對於私有的method和variable而言,它們在child class裏看不到也訪問不到,徹底“隱身”了,可是它們卻仍然真實地存在著。

下麵我寫了一段Java代碼可以明白無誤地證實這一點。我們可以看到,在class private_0下定義的私有變量a和私有函數mnopqrst()在經過了四代繼承之後,仍然存在於class private_run裏,否則繼承下來的公有函數mmnnn()就不可能訪問到它們。

好了,言歸正傳,既然一個child class可以繼承所有parent class乃至一切祖先類中的所有變量和函數,那麽為什麽會有不知道給繼承哪個parent class的method的困惑呢?我想絕對不會是所謂命名衝突的問題,因為這非常還解決:隻要在每個變量前製定它原生的class,那麽所以同名但不同源的變量便可區分開來。

問題絕沒有那麽簡單?望眾位高手能指點迷津,不吝賜教!不勝感激敬佩之至!臨表涕零,不知所雲!

=============================================================================================

import java.io.*;
import java.lang.*;
import java.lang.reflect.*;

class private_0
{
 private int a = 5;
 private void mnopqrst()
 {
  System.out.println( "a =  " + a );
 }
 public void mmnnn()
 {
  mnopqrst();
 }
}

class private_1 extends private_0
{
}

class private_2 extends private_1
{
 private void mnopqrst()
 {
 }
}

public class private_run extends private_2
{
 public static void main( String argv[] )
 {
  private_run private_one = new private_run();
  private_one.mmnnn();
  Class myClass = private_one.getClass();
  Field [] fields = myClass.getFields();
  for( int k = 0; k < fields.length; k++ )
   System.out.println( "fields[" + k + "] = " + fields[k] );
 }
}
==============================================================================================

 

 

所有跟帖: 

這和多繼承有關係嗎? -GuoLuke2- 給 GuoLuke2 發送悄悄話 GuoLuke2 的博客首頁 (0 bytes) () 03/16/2011 postreply 07:16:22

回複:有哪位高手給詳細講解一下C++裏多態繼承的問題(或曰菱形問題) -Largo- 給 Largo 發送悄悄話 (588 bytes) () 03/16/2011 postreply 07:19:19

覺得C++的發明者們很豬頭 -難割難舍中國心- 給 難割難舍中國心 發送悄悄話 難割難舍中國心 的博客首頁 (719 bytes) () 03/17/2011 postreply 00:11:46

哈哈! 如實轉告了。 -π- 給 π 發送悄悄話 (494 bytes) () 03/17/2011 postreply 07:32:35

請您先登陸,再發跟帖!

發現Adblock插件

如要繼續瀏覽
請支持本站 請務必在本站關閉/移除任何Adblock

關閉Adblock後 請點擊

請參考如何關閉Adblock/Adblock plus

安裝Adblock plus用戶請點擊瀏覽器圖標
選擇“Disable on www.wenxuecity.com”

安裝Adblock用戶請點擊圖標
選擇“don't run on pages on this domain”