作者easterday (....)
看板C_and_CPP
標題[問題] C++ Primer 4ed中文版的p579頁...
時間Mon Aug 5 12:27:59 2013
開發平台(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:因為 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