在《c++primer第四版中文》中p579,對「派生類到基類轉換的可訪問性」講的比較模糊,於是用visual studio 2008花了四個小時把大部分能想到的情況都試驗了一下,得出如下結果。
這裡的後代類指的是由基類派生的派生類派生出來的類。也就是類層次中的第三層。
當為public派生時:
派生類定義體中:
建構函式中:
建構函式體中不能定義派生類物件(雖然能通過編譯,但執行中會出現錯誤),但可以定義基類物件、指標和引用。
可以定義派生類和基類的指標及引用。既然不能定義派生類物件,就無法初始化引用(引用必須在定義時初始化),也就無法讓派生類的引用對基類引用初始化或賦值了。並且,派生類的指標也不能初始化,只能賦空值,這樣派生類的指標就可以對基類指標初始化或賦值。但這麼做似乎沒有什麼意義。
複製控制成員:
複製函式:
可以定義派生類和基類的物件、指標、引用。
除了派生類複製函式的功能不能使用外(即不能用派生類物件對派生類物件進行初始化),其它和使用者**中一樣。
賦值函式:
可以定義派生類和基類的物件、指標、引用。
除了派生類賦值函式的功能不能使用外(即不能用派生類物件對派生類物件進行賦值),其它和使用者**中一樣。
析構函式:
建構函式體中不能定義派生類物件(雖然能通過編譯,但執行中會出現錯誤),但可以定義基類物件。
其它函式體中:
可以定義派生類和基類的物件、指標、引用。
情況和在派生類使用者**中一樣。
其它位置:
只能定義派生類指標,能定義基類物件、指標和引用。
後代類定義體中:
所有成員函式中:
可以定義派生類和基類的物件、指標、引用。
情況和在派生類使用者**中一樣。
其它位置:
可以定義派生類和基類的物件、指標、引用。
後代類的使用者**:
後代類物件可以對基類物件進行初始化和賦值;
後代類物件的位址可以對基類的指標進行初始化和賦值;
後代類的物件和引用可以對基類的引用進行初始化和賦值;
派生類使用者**中:
派生類物件可以對基類物件進行初始化和賦值;
派生類物件的位址可以對基類的指標進行初始化和賦值;
派生類的物件和引用可以對基類的引用進行初始化和賦值;
當為protected派生時:
派生類定義體中:
由於派生列表中的訪問標號只對使用者**和後代派生類有影響,對派生類訪問基類成員沒有影響,所以,此處情況應該同上。
後代類定義體中:
派生類可以轉換為基類;
後代類可以轉換為基類(注意:在建構函式和複製控制成員中的限制和派生類中一樣);
派生類使用者**中:
派生類無法轉換為基類;
後代類無法轉換為基類;
當為private派生時:
派生類定義體中:
由於派生列表中的訪問標號只對使用者**和後代派生類有影響,對派生類訪問基類成員沒有影響,所以,此處情況應該同上。
後代類定義體中:
派生類無法轉換為基類;
後代類無法轉換為基類;
使用者**中:
派生類無法轉換為基類;
後代類無法轉換為基類;
下面是用來做試驗的類層次,只舉出幾個例子。實際在試驗過程中,每次只試驗一種情況,試驗完畢馬上擦掉,以免影響接下來的試驗結果。
class a
a(const a &pp)
: base(pp.base) //試驗複製控制函式裡的情況,就是在這裡面加定義和轉換**,這個
virtual ~a() {} //示例在使用者使用此函式時會出錯。例在main()中執行 a a; a b(a)。
private:
int base;
protected:
};class b :private a
//試驗建構函式裡的情況,在這裡加**。這個示例,當使用者在main()中定義b a;時就會出錯。
~b() //試驗析構函式裡的情況,在這裡加**。這個示例,在發生此型別的析構時就會出錯。
private:
int bulk;
protected:
};class c : public b
void uuuu() //試驗其它函式裡面的情況,在這裡面加定義的轉換**,此示例可行,不會出現錯誤。
~c() {}
private:
int bulk2;
protected:
};總結:在可以訪問到基類public成員的地方,可以進行派生類到基類的轉換。
在用visual studio 2008試驗上述規則時,發現在類定義體中,建構函式裡面不能定義本身類的物件,否則在使用者**中使用時,執行會出現錯誤;析構函式裡面也不能定義本身類物件,執行時會出現錯誤;在複製函式裡可以定義本身類物件,在這個函式內部不能使用本身的複製功能,否則執行時同樣會出錯;在賦值函式裡也可以定義本身類物件,在這個函式裡面也不能使用本身類的賦值功能,否則還是會出錯;
在其它成員函式裡面可以定義本身類的物件,也能使用複製控制功能。
在類定義體內,不屬於成員函式的範圍,只能定義本身類的指標或引用。
c 類和C 中定義類的定義
c 類和c 中定義類的定義 相同處 1.1.都需要使用 class標識 1.2.都包含有成員 函式,屬性 1.3.都有private public protect 標識的成員 2.不同之處 2.2.c 申明類及成員時格式 class member 一般在class的末尾處需要乙個英文分割符號 pub...
C 中類的定義
類是物件導向程式設計的基本單位,是一種包含資料成員 函式成員和巢狀型別的資料結構。類的資料成員有常量 域和事件。函式成員包括方法 屬性 索引指示器 運算子 建構函式和析構函式。類和結構同樣都包含了自己的成員,但它們之間最主要的區別在於 類是引用型別,而結構是值型別。類支援繼承機制,通過繼承,派生類可...
c 中類的定義
類的成員分為兩類,分別為資料成員和成員函式。資料成員的型別可以是任何已有的型別,包括整型,浮點型,字元型,陣列,指標和引用等。資料成員還可以是物件,但不能是自身類的物件,而自身類的指標或引用做資料成員是可以的。定義乙個類時,應注意 1 類只是一種自定義資料型別,類中任何成員資料均不能使用關鍵字ext...