C 中繼承和建構函式

2022-02-21 12:48:35 字數 2334 閱讀 8667

乙個類繼承自另外乙個類,他們的建構函式改怎麼辦?

首先必須先宣告:建構函式是不能繼承的

我們先看一段**:第一段**沒有建構函式,第二段有乙個,第三段有兩個。從他們的msil可以看出,有幾個建構函式就有幾個.ctor的il函式。

即使你沒有建構函式,編譯器也會呼叫乙個空的建構函式。讓我們仔細瞧瞧msil**:

我們可以看到每個il中都有   instance void [mscorlib]system.object::.ctor()

由此我們可以得出。不管你有幾個構造器,你都必須執行父類的建構函式,才能執行當前建構函式;同樣對於繼承,必須先實現父類的建構函式,才能執行自己的.ctor

如果我們寫乙個空的建構函式 public class  sometype  } 

就是public class  sometype  }  。這種方法是呼叫(基)類中其他的構造器

(方法一,二 都只有乙個.ctor)

(方法三:有兩個.ctor)

static void main(string args)

.method public hidebysig specialname rtspecialname

instance void  .ctor() cil managed

// end of method program::.ctor

class program

static void main(string args)

}.method public hidebysig specialname rtspecialname

instance void  .ctor(int32 i) cil managed

// end of method program::.ctor

class program

public program(int32 i, int32 j)

static void main(string args)

}.method public hidebysig specialname rtspecialname

instance void .ctor(int32 i,

int32 j) cil managed

// end of method program::.ctor

.method public hidebysig specialname rtspecialname

instance void .ctor(int32 i) cil managed

// end of method program::.ctor

首先我們看看乙個關於this()/base() 也就是本構造器呼叫其他構造器的例子,注意呼叫其他構造器在前,再執行自己的**

class program

public program(int32 i):this() //構造單個變數

public program(int32 j): this()

public program(string m): this()

static void main(string args)

}

三、接下來貼出搞了我一下午的乙個例子。在上篇部落格中講到用范型實現乙個鍊錶。但是那種實現方式中,鍊錶的每個值必須都是同乙個型別,本例中實現任意型別

直接貼**,下面解釋

public class basenode 

}public class node2:basenode

public node2(t data,basenode bnode):base(bnode)

public override string tostring()

}public class leaderfunction2

}

這個例子理解了一下午,搞不懂其內部機制,想用msil解釋,看到那些偽彙編頭都大,主要是由於自己的基礎知識不紮實啊!

本例中:第一,注意繼承要實現父類的構造

第二,為什麼這樣寫可以實現:

其實還是和之前的一樣,雖然到了最後node指向最後乙個 node2物件,但是之前的物件都沒有銷毀,位址儲存在下個node2中的basenode.bnoden中。

C 11中繼承建構函式和委派建構函式

1 繼承建構函式 在c 繼承中,我們可能會遇到下面這個例子 class base base char c m c c private int m value char m c class derived public base 那麼如果我們在構造b的時候想要擁有a這樣的構造方法的話,就必須乙個乙個的...

C 中繼承中遇到的建構函式問題

今天在開發時遇到了乙個之前一直以為理所當然的建構函式問題。先給總結 子類在構造時,如果沒有顯式呼叫父類的建構函式,會先呼叫父類的預設建構函式 無引數的 下面給出不同情況的例子 例子一 父類有預設的建構函式,子類的建構函式隨便 include class base class derive publi...

C 繼承建構函式和委派建構函式

如果我們在構造b的時候想要擁有a這樣的構造方法的話,就必須乙個乙個的透傳各個介面,那麼這是很麻煩的derived int va base va derived char c base c 改寫成這樣 使用繼承建構函式 using base1 base1 而且,更神奇的是,c 11標準繼承建構函式被設...