[問題] C++ Primer 4ed中文版的p579頁...

看板C_and_CPP (C/C++)作者 (....)時間12年前 (2013/08/05 12:28), 編輯推噓2(2014)
留言16則, 4人參與, 最新討論串1/1
開發平台(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

08/05 13:11, , 1F
他說的「public可否存取」是站在外部其它函式的立場
08/05 13:11, 1F

08/05 13:12, , 2F
而不是「dervied class可否存取base class public成員
08/05 13:12, 2F
※ 編輯: easterday 來自: 114.40.129.37 (08/05 14:49)

08/05 14:54, , 3F
這段最詭異的地方是還有一句:如果是protected繼承
08/05 14:54, 3F

08/05 14:55, , 4F
則derived class的成員可轉換至base型別==>明明不行呀..
08/05 14:55, 4F

08/05 15:37, , 5F
不懂為什麼「考慮base class的public成員」可以推出你寫的結
08/05 15:37, 5F

08/05 15:38, , 6F
論: protected 繼承後外面是看不到 base class 的 public
08/05 15:38, 6F

08/05 15:38, , 7F
member 的吧
08/05 15:38, 7F

08/05 15:41, , 8F
另外, subclass 裡無論哪種繼承都看得到 base class 的public
08/05 15:41, 8F

08/05 15:42, , 9F
member, 也都可以把 this up cast 成 base class pointer
08/05 15:42, 9F

08/05 19:29, , 10F
我不知道我的理解有沒有錯誤,所有就不回文了,你說的書本
08/05 19:29, 10F

08/05 19:30, , 11F
上那段翻譯,我認為應該是翻錯了,但英文版寫的也很精簡
08/05 19:30, 11F

08/05 19:31, , 12F
http://codepad.org/1MqwiyKa 應該是像這個範例
08/05 19:31, 12F

08/05 19:32, , 13F
因為 Dog 對 Animal 做private繼承,所以對 Dog 的子類別
08/05 19:32, 13F

08/05 19:33, , 14F
來說,Animal 的 public 成員全都無法存取,故無法轉換
08/05 19:33, 14F

08/07 10:24, , 15F
感謝purpose的範例;讓我獲益良多
08/07 10:24, 15F

08/07 10:45, , 16F
我的結論是:不要理課本在說甚麼,看purpose的範例即可
08/07 10:45, 16F
文章代碼(AID): #1H_odIen (C_and_CPP)
文章代碼(AID): #1H_odIen (C_and_CPP)