作者WGL (飞扬寒星)
看板NTUEE113HW
标题[转录]Re: [问题] 继承函式的呼叫
时间Tue Jan 12 22:31:34 2010
※ [本文转录自 C_and_CPP 看板]
作者: LPH66 ((short)(-15074)) 看板: C_and_CPP
标题: Re: [问题] 继承函式的呼叫
时间: Tue Jan 12 22:04:15 2010
※ 引述《WGL (飞扬寒星)》之铭言:
: 说明:
: 这是某位大大的PO文,可是有些问题还是不太懂想请教一下
: 先是注解编号4,7,14,因为我学到的是继承的derived class不会自动继承base class
: 的constructor,也就是只显示“5”,可是为何显示“15”?
虽然不会继承 但是在建构时会先呼叫父 class 的 constructor
: 再来就是注解10,delete V3时,因为V3指向的是BB的object,所以照理说应该会显示
: “8”,可是结果却显示“4”,我只知道没有virtual的function会执行base class的
: 但是为何destructor也这样?难道要把destrucor也virtual?(好像不行)但是
: constructor却是有执行derived class的啊……
destructor 也是可以 virtual 的....
加了 virtual 之後就能够如你所想的解构了
(也就是说, 10 的答案是 4 的原因正是因为 ~AA 不是 virtual)
: 还有注解13,v4明明没有指向任何object但是为何会印出“7”?是virtual的关系?
: 那virtual不就和static效果一样了?另外我在试的时候virtual和static不可以同时加
: 是否也是这个原因??
我当时给的回答是 12/13两者差别在於有没有用到 vptr
因为有 virtual 的函式必须要动态寻找其 vtable 来呼叫对应函式
那个 AA* 如果指向 AA 物件则得要找 AA 的 f1
指向 BB 物件则得要找 BB 的 f1
你可以比较一下 8 和 15 呼叫的是同一个 f1 这表示这两个物件其实都是 BB
这个功能在 C++ 里是靠 vptr 达成的
而 12 的地方因为没有指向任何 object 所以在找 vptr 时就会发生 segment fault
之所以 13 会正常印出东西的原因
你可以比较一下 9 和 16
这两个完全就是照指标的型态决定它呼叫哪个 f2
也就是说 在没有 virtual 时 决定是哪个 f2 是根据指标型态决定
因此动不到 vptr 所以 13 的情形中即使指标不合法依然能印出 7
(当然如果 BB 的 f2 里有用到 this 那一样会发生 segment fault 就是了)
: 最後就是程式结束的时候,照理说注解17只会印出“8”却印出了“84”……
: 在system("pause")後也印出了“844”……本以为destroy v2和v1时只会印出84……
: 继承里面的有些呼叫实在弄不懂,还请各位大大不吝赐教,谢谢!!!
同样的 在解构时自己的解构完之後会呼叫父 class 的 destructor
这个行为在 destructor 是 virtual 时也相同
所以即使因为透过 virtual 呼叫到的其实是 BB 的 destructor
在执行完後仍然会回头呼叫 AA 的 destructor 的
(ie. 此例中如果 ~AA 加上了 virtual 那 10 的答案就会是 84 了)
--
実琴:「
河野!你真的就这样被
物质慾望给吸引过去了吗?!」
亨:「只要
穿着女装摆出亲切的样子,所有必要花费就能
全免,似乎一点都不坏啊。」
実琴:「难道你没有
男人的尊严了吗?!」
亨:(断然道)「
没有。在
节衣缩食且
生活吃紧的
学生面前,
没有那种东西。」
--プリンセス・プリンセス 第二话
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.28.92
※ 编辑: LPH66 来自: 140.112.28.92 (01/12 22:04)
※ 编辑: LPH66 来自: 140.112.28.92 (01/12 22:11)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.241.120