#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 回答

慕碼人8056858
TA貢獻1803條經驗 獲得超6個贊
Circle(double a=0, double b=0, double c=0){ Point(a,b);//這行寫法是錯誤的 radius = c; }
你只能在構造函數后面的冒號那里(叫初始化列表),用參數來初始化基類.
不能在構造函數體內這么寫(因為當開始執行函數體時, 基類已經完成了構造),你這么寫事實上相當于在棧上構造了一個臨時對象, 函數返回后即被銷毀,于是多了一行輸出.
而類成員(radius)兩種寫法都可以,可以在初始化列表初始化,也可以在函數體里賦值,前者有更高的執行效率(不考慮優化的話).
另外你的main函數中的用法也存在問題,如果你希望用基類的指針儲存派生類對象,那么你需要把基類的析構函數聲明為virtual的,否則在delete的時候會出現內存泄漏.
- 1 回答
- 0 關注
- 276 瀏覽
添加回答
舉報
0/150
提交
取消