Re: [問題] 關於Class指標的觀念
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間11年前 (2013/09/07 09:40)推噓4(4推 0噓 38→)留言42則, 4人參與討論串14/19 (看更多)
會提出這兩個程式碼是因為我想知道什麼情況
member function pointer 的這兩部份會改變,
再猜了很多情形後, 這兩個程式碼可以感受到這個變化。
簡單提一下就好:
void (A::*p)() = &A::abc;
80486b6: c7 44 24 18 05 00 00 movl $0x5,0x18(%esp)
80486bd: 00
80486be: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
80486c5: 00
抱歉, 我貼錯了
這才是我指的第二部份
void (AB::*p)() = &B::ff;
8048736: c7 44 24 28 01 00 00 movl $0x1,0x28(%esp)
804873d: 00
804873e: c7 44 24 2c 08 00 00 movl $0x8,0x2c(%esp)
8048745: 00
--------------------------- 原文 (非我本意) ---------------------------------
void (A::*p)() = &A::abc;
8048646: c7 44 24 18 e2 86 04 movl $0x80486e2,0x18(%esp)
804864d: 08
804864e: c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp)
8048655: 00
---------------------------------------------------------------------
所以在不同情況下, member function pointer 這兩個部份改變也有所不同,
只是我覺得沒完沒了, 所以到此先打住。我可不想玩排列組合。
加上之前的例子, 這樣應該足夠看出
member function pointer 和一般 function pointer 的不同之處。
C 應該沒有類似的東西, C 指標應該很單純就指向某個記憶體位址。
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: 這會影響 member function pointer 第一部份。
: 1 #include <iostream>
: 2 #include <cstdio>
: 3
: 4 using namespace std;
: 5
: 6 struct A
: 7 {
: 8 virtual void func()
: 9 {
: 10 printf("i: %d\n", i_);
: 11 }
: 12 virtual void abc()
: 13 {
: 14 printf("abc i: %d\n", i_);
: 15 }
: 16 A()
: 17 {
: 18 i_=10;
: 19 }
: 20 private:
: 21 int i_;
: 22 };
: 23
: 24
: 25 int main()
: 26 {
: 27 void (A::*p)() = &A::abc;
: 28 A a;
: 29 (a.*p)();
: 30
: 31 return 0;
: 32 }
: member function pointer 的第二部份
: 1 #include <iostream>
: 2 #include <cstdio>
: 3
: 4 using namespace std;
: 5
: 6 struct A
: 7 {
: 8 virtual void func()
: 9 {
: 10 printf("i: %d\n", i_);
: 11 }
: 12 A()
: 13 {
: 14 i_=10;
: 15 }
: 16 private:
: 17 int i_;
: 18 };
: 19
: 20 struct B
: 21 {
: 22 virtual void ff()
: 23 {
: 24 printf("i: %d\n", i_);
: 25 }
: 26 B()
: 27 {
: 28 i_=10;
: 29 }
: 30 private:
: 31 int i_;
: 32 };
: 33
: 34 struct AB : public A, public B
: 35 {
: 36 virtual void func()
: 37 {
: 38 printf("i am ab\n");
: 39 }
: 40 virtual void ff()
: 41 {
: 42 printf("i am ab ff\n");
: 43 }
: 44 };
: 45
: 46 int main()
: 47 {
: 48 void (AB::*p)() = &B::ff;
: 49 AB ab;
: 50 (ab.*p)();
: 51
: 52 return 0;
: 53 }
: 有點沒完沒了的感覺, 就此先打住, 讓有興趣的人研究。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 58.114.139.183
推
09/07 18:21, , 1F
09/07 18:21, 1F
→
09/07 23:09, , 2F
09/07 23:09, 2F
推
09/07 23:14, , 3F
09/07 23:14, 3F
→
09/07 23:15, , 4F
09/07 23:15, 4F
→
09/07 23:46, , 5F
09/07 23:46, 5F
推
09/08 00:11, , 6F
09/08 00:11, 6F
→
09/08 00:11, , 7F
09/08 00:11, 7F
→
09/08 00:32, , 8F
09/08 00:32, 8F
→
09/08 00:33, , 9F
09/08 00:33, 9F
→
09/08 00:33, , 10F
09/08 00:33, 10F
→
09/08 00:46, , 11F
09/08 00:46, 11F
→
09/08 00:46, , 12F
09/08 00:46, 12F
→
09/08 00:49, , 13F
09/08 00:49, 13F
→
09/08 00:49, , 14F
09/08 00:49, 14F
→
09/08 00:50, , 15F
09/08 00:50, 15F
→
09/08 00:51, , 16F
09/08 00:51, 16F
→
09/08 00:51, , 17F
09/08 00:51, 17F
→
09/08 00:51, , 18F
09/08 00:51, 18F
→
09/08 00:52, , 19F
09/08 00:52, 19F
→
09/08 00:53, , 20F
09/08 00:53, 20F
→
09/08 00:53, , 21F
09/08 00:53, 21F
→
09/08 00:55, , 22F
09/08 00:55, 22F
→
09/08 00:56, , 23F
09/08 00:56, 23F
→
09/08 00:57, , 24F
09/08 00:57, 24F
→
09/08 00:58, , 25F
09/08 00:58, 25F
→
09/08 00:59, , 26F
09/08 00:59, 26F
→
09/08 01:00, , 27F
09/08 01:00, 27F
→
09/08 01:01, , 28F
09/08 01:01, 28F
推
09/08 01:01, , 29F
09/08 01:01, 29F
→
09/08 01:03, , 30F
09/08 01:03, 30F
→
09/08 01:04, , 31F
09/08 01:04, 31F
→
09/08 01:05, , 32F
09/08 01:05, 32F
→
09/08 01:06, , 33F
09/08 01:06, 33F
→
09/08 01:07, , 34F
09/08 01:07, 34F
→
09/08 01:08, , 35F
09/08 01:08, 35F
→
09/08 01:08, , 36F
09/08 01:08, 36F
→
09/08 01:10, , 37F
09/08 01:10, 37F
→
09/08 01:11, , 38F
09/08 01:11, 38F
→
09/08 01:13, , 39F
09/08 01:13, 39F
→
09/08 01:14, , 40F
09/08 01:14, 40F
→
09/08 02:20, , 41F
09/08 02:20, 41F
→
09/08 02:21, , 42F
09/08 02:21, 42F
※ 編輯: descent 來自: 59.125.239.46 (09/11 08:23)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章