• Welcome to ComeFromChina Community (CFC中文网)! We are the largest Chinese Canadian community forum in Ottawa. Please to participate in discussions, post topics, view images, and access full community features. Join us today! 欢迎来到CFC中文网。请登录以参与讨论、发布主题并查看图片。

懂c++达人乱进,我有很多问题

大漠张三

知名会员
VIP
注册
2003-04-18
消息
9,429
荣誉分数
84
声望点数
158

代码:
class D1 : public Base { 
    public: 
         D1(int b, int d1) : Base(b);
         ~D1();


我想问,如果D1 constructor 被call的话,一个Base object也会被created对不对?
如果D1 destructor被call呢?Base 的destructor会不会被call?假设~D1里面没有“~Base()”这么一行。




代码:
#include <iostream> 
using namespace std; 

class DivideByZero{ 
    public: void print(); 
}; 

class Negative{ 
    public: void print(); 
}; 

void DivideByZero:: print(){ 
    cout << “Divide by Zero” << endl; 
} 

void Negative:: print(){ 
    cout << “Negative” << endl; 
}

void bottom(int i){ 
    if (i == 0) throw DivideByZero(); 
    cout << “100/i == “ << 100/i << endl; 
} 

void middle(int i){ 
    try { 
      bottom (i); 
      if (i < 0) throw Negative(); 
    } 
    catch (DivideByZero &e){ 
      cout << “In middle: “; 
      e.print(); 
    } 
} 

void top(int i){ 
    middle(i); 
    try{ 
      middle(10); 
    } 
    catch (...){ 
      cout << “Error in top” << endl; 
    } 
}

int main(){ 
    int i; cin >> i; 
    try{ 
      top(i); 
    } 
    catch (Negative){ 
      cout << “Negative in main” << endl; 
    } 
    catch (DivideByZero){ 
      cout << “Divide by zero in main” << endl; 
    } 
    cout << “Done” << endl; return 0; 
}


我想问,如果i=-10的话,output是什么?
如果i = 0,output是什么?
 
destructor会被call的。因为D1是从base继承过来的。你在创建一个D1的reference的时候,他回去看super class的相关。然后在spuer class县调用一便。然后,子类再加上额外的属性!

你可以尝试自己debug看看。来求证。比如。你写一个super class叫。A,子类为B.随便在heap内存里丢些垃圾。用~A()来删掉这些垃圾。~B()里面就不需要在操作了。否则就是double deletion肯定出错!
 
最初由 Squall 发布
destructor会被call的。因为D1是从base继承过来的。你在创建一个D1的reference的时候,他回去看super class的相关。然后在spuer class县调用一便。然后,子类再加上额外的属性!

你可以尝试自己debug看看。来求证。比如。你写一个super class叫。A,子类为B.随便在heap内存里丢些垃圾。用~A()来删掉这些垃圾。~B()里面就不需要在操作了。否则就是double deletion肯定出错!


那就是说如果
~Base(){cout<<“Base ”;}
~D1() {cout<< “D1”;)

如果在main里call ~D1();output就会是“Base D1”?
 
这是道output的题目咯。这个我很suck的。2个肯定都要call到的。倒是我忘了次序了:(

为了求证,自己写个小程序。求证一下吧。
 
最初由 Squall 发布
这是道output的题目咯。这个我很suck的。2个肯定都要call到的。倒是我忘了次序了:(

为了求证,自己写个小程序。求证一下吧。


如果Base class的destructor是virtual呢?那岂不是一个destructor要call 两遍?
 
看见楼主背个小包儿出去玩儿。
 
不会, 不会...
不过大家加油了...
 
最初由 大漠张三 发布



如果Base class的destructor是virtual呢?那岂不是一个destructor要call 两遍?

就因为是virtual才不会call两次,试一下就知道了
 
后退
顶部
首页 论坛
消息
我的