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

作者: fsvy (...無言...)   2017-08-17 23:26:10
問題(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;
}
作者: steve1012 (steve)   2017-08-18 23:08:00
Override 算是好的practice
作者: poiuy777 (帥氣又拉風)   2017-08-18 23:01:00
真心覺得在新手面前教繼承根本是耍流氓 最不重要的一環
作者: steve1012 (steve)   2017-08-18 22:49:00
Virtual function 簡化說是你用base class ptr 指向child class obj並呼叫virtual method 時候會呼叫到childclass 的implementation這真的隨便google 就有圖文解說 比看推文還要好懂很多為啥不自己上網查一下就好了...比發文還快
作者: jerryh001   2017-08-18 19:04:00
很大概的講就是 virtual用.的就跟普通函數一樣沒甚麼特別 用->會先確定該物件實際上是哪個class 然後執行該class對應的函數
作者: s4300026 (s4300026)   2017-08-18 19:37:00
是不是少了override?
作者: bibo9901 (function(){})()   2017-08-18 19:49:00
override 不是必要的
作者: fsvy (...無言...)   2017-08-19 03:06:00
感謝steve大的解說。那若不使用base class ptr而使用. 就很明確的呼叫各自class內的method,對嗎?
作者: steve1012 (steve)   2017-08-19 02:19:00
不是virtual function 不會在virtual table 裡 base class pointer 怎麼知道child class 的function 在哪
作者: fsvy (...無言...)   2017-08-19 01:54:00
謝謝steve大的熱心解惑. 我想我知道疑惑點了:疑惑點是:若用base class ptr指向child class obj,卻不是使用virtual method, 會執行base class method的原因。
作者: LPH66 (-6.2598534e+18f)   2017-08-18 18:05:00
關鍵字: "多型" 有書的話去找這個地方仔細讀
作者: fsvy (...無言...)   2017-08-18 18:11:00
先謝謝樓上L大的熱心,我一定會仔細研讀的。
作者: fsvy (...無言...)   2017-08-18 17:38:00
謝謝樓上s大的建議,作為新手,我會再理解virtual的用意。若有熱心版友,願意跟我說baz->f()、baz->g()、bar->f()差別就在這邊和您(們)先說聲感謝了
作者: bibo9901 (function(){})()   2017-08-18 16:06:00
而且還沒考用reference
作者: Schottky (順風相送)   2017-08-18 16:04:00
真的建議去看一下 virtual 這個字的作用
作者: bibo9901 (function(){})()   2017-08-18 16:02:00
哪有不一樣
作者: fsvy (...無言...)   2017-08-18 15:52:00
那麼也請教:為什麼bar->f() 和 baz->f()結果會不同呢?
作者: jerryh001   2017-08-17 23:42:00
丟進電腦跑一次就知道了吧
作者: shadow0326 (非議)   2017-08-17 23:42:00
你想知道結果的話可以直接跑跑看呀 然後提出你不懂的部份
作者: longlongint (華哥爾)   2017-08-18 00:13:00
你的想法呢
作者: fsvy (...無言...)   2017-08-18 00:45:00
回樓上j版友和s版友,我有跑過結果。 不懂的地方在於:直接執行function,及使用指向class的指標去執行,其結果為何會不同,這點與我想的不一樣。 因此在版上求教。即:baz->f(); baz->g(); 這2行的執行結果。
作者: james732 (好人超)   2017-08-18 01:01:00
你可能要先去查virtual這個字的用途?
作者: steve1012 (steve)   2017-08-18 02:39:00
這不是virtual 的本意嗎
作者: steve1012 (steve)   2017-08-19 08:15:00
聽起來沒錯
作者: fsvy (...無言...)   2017-08-19 15:18:00
謝謝!謝謝steve大,以及各位熱心的板友。 受教了!
作者: Killercat (殺人貓™)   2017-08-21 14:20:00
會有這問題大概都是java出身的 因為java沒有virtual關鍵字,預設是每個function都是virtual除非final只能說這要花點時間習慣(@Override這annotation非強制)

Links booklink

Contact Us: admin [ a t ] ucptt.com