w********p 发帖数: 948 | 1 【 以下文字转载自 Programming 讨论区 】
发信人: whitetulip (白色郁丁香), 信区: Programming
标 题: 问关于C++Destructor的问题
关键字: 'base class' 'destructor' 'case' 'assignment'
发信站: BBS 未名空间站 (Sat Nov 7 01:06:59 2009, 美东)
#include
using namespace std;
class Base
{
public:
Base(){ cout<<"Constructor: Base"<
~Base(){ cout<<"Destructor : Base"<
};
class Derived: public Base
{
//Doing a lot of jobs by extending the functionality
public:
Derived(){ cout<<"Constructor: Derived"<
~Derived() |
a**********s 发帖数: 588 | 2 我最近缺包子, 所以有兴趣, 2个包子一条, 总共16个包子吧? |
i****h 发帖数: 321 | 3 非大牛,试着答一下。这题主要是要考非virtual destructor。
g点在这句
Var2 = (Base) *Var;
声明了*Var 是Base的,destructor又不是virtual,所以先要调用
Destructor : Base //4
然后调用其实际类型的destructor。
Destructor : Derived //5
从而又调用了一次Base的destructor
Destructor : Base //6
最后一行就不需要解释了。 |
a**********s 发帖数: 588 | 4 int main()
{
Derived *Var = new Derived();
>>>> 这个语句, 分别调用基类和派生类的构造函数, 于是
>>>> Constructor: Base //1
>>>> Constructor: Derived //2
Base Var2;
>>>> 这个语句, 调用基类构造函数, 于是
>>>> Constructor: Base //3
Var2 = (Base) *Var;
>>>> 这个语句有一丝丝复杂, 等号右边产生一个临时Base类型的变量,
>>>> 调用Base类的"拷贝构造函数" Base(const Base&), 但是
>>>> 这个你没有定义, 所以什么都没有打印出来
>>>> 临时变量消灭的时候, 调用析构函数, 于是:
Destructor : Base //4
delete Var;
>>>> 这个比较简单
>>>> Destructor : Derived //5
>>>> Destructor : Base //6
return 0;
>>>> 这个也比较简单, 因为Var1的生命周期随着函数的返回结束
>>> |
a**********s 发帖数: 588 | 5 你快点到了, 但是差了那么一点点---没有解释为什么调用destructor, 却看不到调用
constructor ^_^
而且说的调用destructor的理由也好像怪怪的, 和virtual一点关系都没 :)
【在 i****h 的大作中提到】 : 非大牛,试着答一下。这题主要是要考非virtual destructor。 : g点在这句 : Var2 = (Base) *Var; : 声明了*Var 是Base的,destructor又不是virtual,所以先要调用 : Destructor : Base //4 : 然后调用其实际类型的destructor。 : Destructor : Derived //5 : 从而又调用了一次Base的destructor : Destructor : Base //6 : 最后一行就不需要解释了。
|
i****h 发帖数: 321 | 6 拜大牛,你的的确清晰多了。
【在 a**********s 的大作中提到】 : 你快点到了, 但是差了那么一点点---没有解释为什么调用destructor, 却看不到调用 : constructor ^_^ : 而且说的调用destructor的理由也好像怪怪的, 和virtual一点关系都没 :)
|
a**********s 发帖数: 588 | 7 不敢, 真正的大牛都潜水
【在 i****h 的大作中提到】 : 拜大牛,你的的确清晰多了。
|
w********p 发帖数: 948 | 8 谢谢牛牛们,欢迎继续指教,包子for party 1 is done, but it continue for party 2
包子for party 2 也没了,赫赫 |
g*******y 发帖数: 1930 | 9 可惜来晚了,被牛人抢了先,没吃到包子。。。
唯一比较tricky的地方就是那个static_cast的地方有临时的base object,死掉
的时候会调用一个destructor
【在 w********p 的大作中提到】 : 谢谢牛牛们,欢迎继续指教,包子for party 1 is done, but it continue for party 2 : 包子for party 2 也没了,赫赫
|
w********p 发帖数: 948 | 10 问题继续, 包子继续
class Base
{
public:
Base(){ cout<<"Constructor: Base"<
~Base(){ cout<<"Destructor : Base"<
};
class Derived: public Base
{
public:
Derived(){ cout<<"Constructor: Derived"<
~Derived(){ cout<<"Destructor : Derived"<
};
int main()
{
Derived Var1;
Base Var2(Var1);
Derived Var3(Var1);
return 0;
}
output:
Constructor: Base
Constructor: Derived
Destructor : Derived
Destructor : Base
Destructor : Base
Destructor : Derived
Destructor : Base
请解释一下
【在 g*******y 的大作中提到】 : 可惜来晚了,被牛人抢了先,没吃到包子。。。 : 唯一比较tricky的地方就是那个static_cast的地方有临时的base object,死掉 : 的时候会调用一个destructor
|
a**********s 发帖数: 588 | 11 int main()
{
Derived Var1;
>>>> construct var1
>>>> Constructor: Base
>>>> Constructor: Derived
Base Var2(Var1);
Derived Var3(Var1);
>>>> The construction of above wont print anything
>>>> since the default copy constructs are done silently
return 0;
>>>> UPON RETURN <<<<
>>>> destruct var3
>>>> Destructor : Derived
>>>> Destructor : Base
>>>> destruct var2
Destructor : Base
>>>> destruct var1
Destructor : Derived
Destructor : Base
} |
w********p 发帖数: 948 | 12 谢谢, 解释的好明白哦。还省了我的包子, 赫赫,开心
【在 a**********s 的大作中提到】 : int main() : { : Derived Var1; : >>>> construct var1 : >>>> Constructor: Base : >>>> Constructor: Derived : Base Var2(Var1); : Derived Var3(Var1); : >>>> The construction of above wont print anything : >>>> since the default copy constructs are done silently
|
m********0 发帖数: 2717 | 13 沙盘mm是大牛。
【在 i****h 的大作中提到】 : 拜大牛,你的的确清晰多了。
|
s*******i 发帖数: 712 | 14 是啊。。。我也发现了
【在 m********0 的大作中提到】 : 沙盘mm是大牛。
|