Re: [問題] 多重繼承疑惑
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: 是的,答案就是利用 vtable。事實上 compiler 在 vtable 中,
: 除了加入 function pointer 之外,還會記錄這個 vtable 屬於哪個 class。
: 而 C++ 提供了 dynamic_cast 這個轉型用的 operator,幫助你在這種情況下轉形。
: 所以你的 code 要改成這樣:
: A *p =(B*) new D;
: cout << &(p->A::a) << endl;
: cout << &( (dynamic_cast<B*>(p) )->B::a) << endl;
: cout << &( (dynamic_cast<C*>(p) )->C::a) << endl;
: dynamic_cast<B*>(p) 的意思是說,我不知道 p 真正指向哪一種 class,
: 但我想利用 vtable 中的資訊,試圖把 p 「正確地」轉成 B*。
: 改用 dynamic_cast 後,我想結果應該會符合你的預期。
另外也可以考慮使用 static_cast 來偏移 D* pointer。
D *p = new D;
cout << &static_cast<B*>(p)->a << endl;
cout << &static_cast<C*>(p)->a << endl;
cout << "D object:" << p << endl;
cout << "B object in D:" << static_cast<B*>(p) << endl;
cout << "C object in D:" << static_cast<D*>(p) << endl;
*補充一點:
沿用 QQ29 的 class A, B, C, D 定義,這樣子的碼很常見:
B* bP = new D;
實際上它就是等同:
B* bP = static_cast<B*>(new D);// 我這次不提 bP 的值與 new D 是有偏差的 :D
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.173.136.12
推
02/11 22:59, , 1F
02/11 22:59, 1F
→
02/11 23:00, , 2F
02/11 23:00, 2F
→
02/11 23:00, , 3F
02/11 23:00, 3F
→
02/12 00:03, , 4F
02/12 00:03, 4F
→
02/12 00:03, , 5F
02/12 00:03, 5F
→
02/12 00:09, , 6F
02/12 00:09, 6F
→
02/12 00:09, , 7F
02/12 00:09, 7F
→
02/12 00:11, , 8F
02/12 00:11, 8F
→
02/12 00:12, , 9F
02/12 00:12, 9F
→
02/12 00:13, , 10F
02/12 00:13, 10F
→
02/12 00:20, , 11F
02/12 00:20, 11F
→
02/12 00:20, , 12F
02/12 00:20, 12F
→
02/12 00:20, , 13F
02/12 00:20, 13F
→
02/12 00:21, , 14F
02/12 00:21, 14F
→
02/12 00:29, , 15F
02/12 00:29, 15F
→
02/12 00:30, , 16F
02/12 00:30, 16F
→
02/12 00:30, , 17F
02/12 00:30, 17F
→
02/12 00:31, , 18F
02/12 00:31, 18F
→
02/12 00:34, , 19F
02/12 00:34, 19F
※ 編輯: sbrhsieh 來自: 218.173.134.25 (02/12 00:39)
→
02/12 00:35, , 20F
02/12 00:35, 20F
推
02/12 00:37, , 21F
02/12 00:37, 21F
→
02/12 00:38, , 22F
02/12 00:38, 22F
c-style casting 指 (type) 這種 casting 寫法。它的語意是隨著使用情況而異。
int n = (int) 3.14; // 同 static_cast
float *fp = (float*) &n; // 同 reinterpret_cast
char *str = (char*) "Hello"; // const_cast
因為 c-style casting 的語意不明確,所以 C++ 訂了四種不同語意的 casting:
static_cast
const_cast
reinterpret_cast
dynamic_cast
讓 programmer 可以更明確地向 compiler 表示意圖。(而不是任由 compiler 決定)
※ 編輯: sbrhsieh 來自: 218.173.134.25 (02/12 00:55)
→
02/12 00:55, , 23F
02/12 00:55, 23F
→
02/12 00:56, , 24F
02/12 00:56, 24F
→
02/12 00:57, , 25F
02/12 00:57, 25F
→
02/12 00:57, , 26F
02/12 00:57, 26F
→
02/12 00:58, , 27F
02/12 00:58, 27F
→
02/12 01:01, , 28F
02/12 01:01, 28F
討論串 (同標題文章)