C++繼承方式總共分為以下幾種:
public、private、protected三種(它們直接影響到衍生類別的成員、及其對象對基類成員訪問的規則)。
(1)public(公有繼承):繼承時保持基類中private成員被隱藏,其它各成員屬性不變,被繼承為衍生類別的成員。so衍生類別的成員只能訪問基類中的public/protected成員,而不能訪問private成員;衍生類別的對象只能訪問基類中的public成員。
(2)private(私人繼承):繼承時基類中private成員被隱藏,其它各成員屬性均變為private,被繼承為衍生類別的成員。衍生類別的成員也只能訪問基類中的public/protected成員,而不能訪問private成員;衍生類別的對象不能訪問基類中的任何的成員。
(3)protected(保護性繼承):繼承時基類中private成員被隱藏,其它各成員屬性均變為protected,被繼承為衍生類別的成員。衍生類別的成員只能訪問基類中的public/protected成員,而不能訪問private成員;衍生類別的對象不能訪問基類中的任何的成員。
但是C#的繼承只能通過成員變數的許可權控制來實現。
在C++中,一個變數如果通過不同的繼承方式,那麼它在繼承的過程中可訪問程度會發生很大變化。
如
Class A{public int a1(){};protected int a2(){};private int a3(){};}Class B1:protected A{ a1;//可訪問,變為自身的preotected a2;//可訪問,變為自身的preotected //a3;不可訪問}Class B2:private A{ a1;//可訪問,變為自身的private a2;//可訪問,變為自身的private //a3;不可訪問}Class C1:protected B1{ a1;//是B1的保護成員,被繼承,變為自身的保護成員 a2;//是B1的保護成員,被繼承,變為自身的保護成員}Class C2:protected B2{ //a1;是B2的私人成員,已經無法再被繼承 //a2;是B2的私人成員,已經無法再被繼承}
所以,一個可以被繼承的成員變數在不同的繼承方式中,最後有可能丟失無法再被繼承。而C#中,沒有繼承方式的概念。一個成員變數如果可以被繼承,那麼他就會被衍生類別一直繼承。
就像一個家族的傳家之寶,C++中由於某一代的原因,這個傳家之寶可能會不傳給下一代,致使後代都得不到。而C#中,這個傳家之寶會一直被傳遞下去(除非在傳遞過程中發生其它的人為因素)。
當然了,本文的探究僅限於繼承的可訪問性
(後繼文章將就C#的成員修飾符做一定的簡要分析)