搜尋

首頁  >  問答  >  主體

c++ - 关于派生类析构函数的问题

#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

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

黄舟黄舟2803 天前562

全部回覆(1)我來回復

  • 高洛峰

    高洛峰2017-04-17 11:07:20

    Circle(double a=0, double b=0, double c=0)
    {
        Point(a,b);//这行写法是错误的
        radius = c;
    }
    

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

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

    回覆
    0
  • 取消回覆