#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;
}執(zhí)行的結(jié)果是:Executing Point destructor但我把派生類的構(gòu)造函數(shù):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;
}運行結(jié)果是:Executing Point destructor Executing Point destructor
1 回答

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