[问题] 关于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