看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) vc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) none 問題(Question): C++ Primer 4ed中文版的page579 討論derived-to base轉換的可用性 在有一個鑰匙的框框裡面強調:可考慮base class的public成員是否可存取 如果上面這句話是對的 就會有一個結論: public繼承-->可以做derived-to-base轉換 protected繼承-->可以做derived-to-base轉換 private繼承-->不能做derived-to-base轉換 但是下面又有一句話說: 如果繼承關係是private或protected,就不能做derived-to-base轉換 所以我用以下的code驗證,似乎下面這句話是對的... #include <iostream> #include <string> using namespace std; class B { public: int Bdata; }; class D1 :public B { }; class D2 : protected B { }; class D3 : private B { }; int main() { D1 d1; D2 d2; D3 d3; B b1= (B)d1; B b2= (B)d2; //error C2243 B b3= (B)d3; //error C2243 return 0; } 那上面那個鑰匙的框到底在講甚麼啊?以下是課本的摘錄 "若想判斷是否可轉換至base,可考慮base class的public成員可否存取。 如果可以,轉換便可進行;否則無法進行" 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.226.60
littleshan:他說的「public可否存取」是站在外部其它函式的立場 08/05 13:11
littleshan:而不是「dervied class可否存取base class public成員 08/05 13:12
※ 編輯: easterday 來自: 114.40.129.37 (08/05 14:49)
easterday:這段最詭異的地方是還有一句:如果是protected繼承 08/05 14:54
easterday:則derived class的成員可轉換至base型別==>明明不行呀.. 08/05 14:55
scwg:不懂為什麼「考慮base class的public成員」可以推出你寫的結 08/05 15:37
scwg:論: protected 繼承後外面是看不到 base class 的 public 08/05 15:38
scwg:member 的吧 08/05 15:38
scwg:另外, subclass 裡無論哪種繼承都看得到 base class 的public 08/05 15:41
scwg:member, 也都可以把 this up cast 成 base class pointer 08/05 15:42
purpose:我不知道我的理解有沒有錯誤,所有就不回文了,你說的書本 08/05 19:29
purpose:上那段翻譯,我認為應該是翻錯了,但英文版寫的也很精簡 08/05 19:30
purpose:http://codepad.org/1MqwiyKa 應該是像這個範例 08/05 19:31
purpose:因為 Dog 對 Animal 做private繼承,所以對 Dog 的子類別 08/05 19:32
purpose:來說,Animal 的 public 成員全都無法存取,故無法轉換 08/05 19:33
easterday:感謝purpose的範例;讓我獲益良多 08/07 10:24
easterday:我的結論是:不要理課本在說甚麼,看purpose的範例即可 08/07 10:45