[問題] 關於C++ virtual function Runtime的考題

看板C_and_CPP作者 (...無言...)時間8年前 (2017/08/17 23:26), 8年前編輯推噓11(11033)
留言44則, 12人參與, 最新討論串1/1
問題(Question): 各位熱心的版友們,小弟是C++新手,對於C++一些細部觀念掌握度不那麼高。 下列的程式題,判斷起來,是在考: 程式在runtion時,呼叫了virtual function與否。 整個題組似乎考得更徹底: 除了用class本身執行內部public的function外, 還用指向class的指標去執行。 由於題組幾乎全考到了,因此請教熱心的版友們, 這個程式題組的執行, 直接執行function,以及使用指向class的指標去執行,結果是否有異? 謝謝各位熱心的版友。 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> class Foo{ public: void f(){ std::cout << "Foo::f()" << std::endl; } virtual void g(){ std::cout << "Foo::g()" << std::endl; } }; class Bar: public Foo{ public: void f(){ std::cout << "Bar::f()" << std::endl; } virtual void g(){ std::cout << "Bar::g()" << std::endl; } }; int main(){ Foo foo; Bar bar; Foo *baz = &bar; Bar *quux = &bar; foo.f(); foo.g(); bar.f(); bar.g(); baz->f(); baz->g(); quux->f(); quux->g(); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.52.172 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1502983573.A.9FE.html

08/17 23:42, , 1F
丟進電腦跑一次就知道了吧
08/17 23:42, 1F

08/17 23:42, , 2F
你想知道結果的話可以直接跑跑看呀 然後提出你不懂的
08/17 23:42, 2F

08/17 23:42, , 3F
部份
08/17 23:42, 3F

08/18 00:13, , 4F
你的想法呢
08/18 00:13, 4F

08/18 00:45, , 5F
回樓上j版友和s版友,我有跑過結果。 不懂的地方在於:
08/18 00:45, 5F

08/18 00:46, , 6F
直接執行function,及使用指向class的指標去執行,
08/18 00:46, 6F

08/18 00:47, , 7F
其結果為何會不同,這點與我想的不一樣。 因此在版上求教。
08/18 00:47, 7F

08/18 00:50, , 8F
即:baz->f(); baz->g(); 這2行的執行結果。
08/18 00:50, 8F

08/18 01:01, , 9F
你可能要先去查virtual這個字的用途?
08/18 01:01, 9F

08/18 02:39, , 10F
這不是virtual 的本意嗎
08/18 02:39, 10F

08/18 15:52, , 11F
那麼也請教:為什麼bar->f() 和 baz->f()結果會不同呢?
08/18 15:52, 11F

08/18 16:02, , 12F
哪有不一樣
08/18 16:02, 12F

08/18 16:04, , 13F
真的建議去看一下 virtual 這個字的作用
08/18 16:04, 13F

08/18 16:06, , 14F
而且還沒考用reference
08/18 16:06, 14F
※ 編輯: fsvy (36.224.47.209), 08/18/2017 17:37:45

08/18 17:38, , 15F
謝謝樓上s大的建議,作為新手,我會再理解virtual的用意。
08/18 17:38, 15F

08/18 17:45, , 16F
若有熱心版友,願意跟我說baz->f()、baz->g()、bar->f()差別
08/18 17:45, 16F

08/18 17:45, , 17F
就在這邊和您(們)先說聲感謝了
08/18 17:45, 17F

08/18 18:05, , 18F
關鍵字: "多型" 有書的話去找這個地方仔細讀
08/18 18:05, 18F

08/18 18:11, , 19F
先謝謝樓上L大的熱心,我一定會仔細研讀的。
08/18 18:11, 19F

08/18 19:04, , 20F
很大概的講就是 virtual用.的就跟普通函數一樣沒甚麼特
08/18 19:04, 20F

08/18 19:04, , 21F
別 用->會先確定該物件實際上是哪個class 然後執行該cl
08/18 19:04, 21F

08/18 19:04, , 22F
ass對應的函數
08/18 19:04, 22F

08/18 19:37, , 23F
是不是少了override?
08/18 19:37, 23F

08/18 19:49, , 24F
override 不是必要的
08/18 19:49, 24F

08/18 22:49, , 25F
Virtual function 簡化說是你用base class ptr 指向chi
08/18 22:49, 25F

08/18 22:49, , 26F
ld class obj並呼叫virtual method 時候會呼叫到child
08/18 22:49, 26F

08/18 22:49, , 27F
class 的implementation
08/18 22:49, 27F

08/18 22:50, , 28F
這真的隨便google 就有圖文解說 比看推文還要好懂很多
08/18 22:50, 28F

08/18 22:50, , 29F
為啥不自己上網查一下就好了...
08/18 22:50, 29F

08/18 22:51, , 30F
比發文還快
08/18 22:51, 30F

08/18 23:01, , 31F
真心覺得在新手面前教繼承根本是耍流氓 最不重要的一環
08/18 23:01, 31F

08/18 23:08, , 32F
Override 算是好的practice
08/18 23:08, 32F

08/19 01:54, , 33F
謝謝steve大的熱心解惑. 我想我知道疑惑點了:
08/19 01:54, 33F

08/19 01:57, , 34F
疑惑點是:若用base class ptr指向child class obj,卻不是
08/19 01:57, 34F

08/19 01:57, , 35F
使用virtual method, 會執行base class method的原因。
08/19 01:57, 35F

08/19 02:19, , 36F
不是virtual function 不會在virtual table 裡 base cl
08/19 02:19, 36F

08/19 02:19, , 37F
ass pointer 怎麼知道child class 的function 在哪
08/19 02:19, 37F

08/19 03:06, , 38F
感謝steve大的解說。那若不使用base class ptr而使用. 就很
08/19 03:06, 38F

08/19 03:06, , 39F
明確的呼叫各自class內的method,對嗎?
08/19 03:06, 39F

08/19 08:15, , 40F
聽起來沒錯
08/19 08:15, 40F

08/19 15:18, , 41F
謝謝!謝謝steve大,以及各位熱心的板友。 受教了!
08/19 15:18, 41F

08/21 14:20, , 42F
會有這問題大概都是java出身的 因為java沒有virtual關
08/21 14:20, 42F

08/21 14:21, , 43F
鍵字,預設是每個function都是virtual除非final
08/21 14:21, 43F

08/21 14:22, , 44F
只能說這要花點時間習慣(@Override這annotation非強制)
08/21 14:22, 44F
文章代碼(AID): #1PbRMLd- (C_and_CPP)