c++ - 关于派生类析构函数的问题
黄舟
黄舟 2017-04-17 11:05:20
0
1
555
#include <iostream>
using namespace std;

class Point
{
 public:
Point(double a = 0, double b = 0)
{
    x = a; 
    y = b;
}
 ~Point(){ cout << "Executing Point destructor \n";}

 private:
double x;
double y;
  };

 class Circle: public Point
{
public:
Circle(double a=0, double b=0, double c=0):Point(a,b), radius(c){}

~Circle(){cout<<"executing Circle destructor"<<endl;}

private:
double radius;
};

int main()
{
Point * p = new Circle(1, 1, 4);
delete p;
return 0;
}

执行的结果是:

Executing Point destructor

但我把派生类的构造函数:

Circle(double a=0, double b=0, double c=0):Point(a,b), radius(c){}

改成

Circle(double a=0, double b=0, double c=0)
{
    Point(a,b);
    radius = c;
}

运行结果是:

Executing Point destructor 
Executing Point destructor

为什么第二种构造函数的方式,运行结果会多显示一行呢?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回覆(1)
小葫芦
Circle(double a=0, double b=0, double c=0)
{
    Point(a,b);//这行写法是错误的
    radius = c;
}

你隻能在構造函數後麵的冒號那裏(叫初始化列表),用參數來初始化基類.
不能在構造函數體內這麼寫(因為當開始執行函數體時, 基類已經完成了構造),你這麼寫事實上相當於在棧上構造了一個臨時對象, 函數返回後即被銷毀,於是多了一行輸出.
而類成員(radius)兩種寫法都可以,可以在初始化列表初始化,也可以在函數體裏賦值,前者有更高的執行效率(不考慮優化的話).

另外你的main函數中的用法也存在問題,如果你希望用基類的指針儲存派生類對象,那麼你需要把基類的析構函數聲明為virtual的,否則在delete的時候會出現內存泄漏.

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板