作者WGL (飞扬寒星)
看板NTUEE113HW
标题[转录]Re: [问题] 继承函式的呼叫
时间Tue Jan 12 22:31:51 2010
※ [本文转录自 C_and_CPP 看板]
作者: tinlans ( ) 看板: C_and_CPP
标题: Re: [问题] 继承函式的呼叫
时间: Tue Jan 12 22:13:35 2010
※ 引述《WGL (飞扬寒星)》之铭言:
: 说明:
: 这是某位大大的PO文,可是有些问题还是不太懂想请教一下
: 先是注解编号4,7,14,因为我学到的是继承的derived class不会自动继承base class
: 的constructor,也就是只显示“5”,可是为何显示“15”?
这是「呼叫」,
因为 dervied class 的构造包含了 base 的部分,
所以建构的顺序是先建构 base 的部分 (使 base 的 constructor 被呼叫),
再建构 derived 所属的部分,
解构的顺序则是相反。
预设是呼叫 base 的 default constructor,
除非你明确在成员初值列指定其它 base 的 constructor。
: 再来就是注解10,delete V3时,因为V3指向的是BB的object,所以照理说应该会显示
: “8”,可是结果却显示“4”,我只知道没有virtual的function会执行base class的
: 但是为何destructor也这样?难道要把destrucor也virtual?(好像不行)但是
: constructor却是有执行derived class的啊……
为什麽不行?
任何一本书都有跟你说什麽叫 virtual destructor 吧?
: 还有注解13,v4明明没有指向任何object但是为何会印出“7”?是virtual的关系?
: 那virtual不就和static效果一样了?另外我在试的时候virtual和static不可以同时加
: 是否也是这个原因??
因为 F2 不是 dynamic binding 的 virtual function,
所以函式的位址可以在 compile-time 或 linking-time 求得,
member function call 虽然语法上写成 obj->foo(arg1, arg2),
但其实它真正的实作是类似 foo(obj, arg1, arg2) 这种东西,
只是把第一个参数隐藏起来,
然後变成所谓的 this 指标罢了,
也就是说即使你的 obj 是个无效值,
只要你在 foo() 里不要使用到它就不会有事。
v4->F2() 的 F2() 里没有使用到任何物件的成员,
只是呼叫了 global 的 printf(),
所以不会出事。
: 最後就是程式结束的时候,照理说注解17只会印出“8”却印出了“84”……
: 在system("pause")後也印出了“844”……本以为destroy v2和v1时只会印出84……
就像一开始讲的,
解构顺序是反过来,
先解构 derived 再解构 base,
所以解构子的呼叫顺序也是这样。
--
Ling-hua Tseng (
[email protected])
Department of Computer Science, National Tsing-Hua University
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
http://www.tinlans.org
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.119.198
※ 编辑: tinlans 来自: 118.160.119.198 (01/12 22:18)
--
我宁以顷刻短暂的繁华,换取千年无尽的落寞。
欢迎大家上我的“部落格”:
http://coldstar.5d6d.com/forum-2-1.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.241.120