#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
为什么第二种构造函数的方式,运行结果会多显示一行呢?
你隻能在構造函數後麵的冒號那裏(叫初始化列表),用參數來初始化基類.
不能在構造函數體內這麼寫(因為當開始執行函數體時, 基類已經完成了構造),你這麼寫事實上相當於在棧上構造了一個臨時對象, 函數返回後即被銷毀,於是多了一行輸出.
而類成員(radius)兩種寫法都可以,可以在初始化列表初始化,也可以在函數體裏賦值,前者有更高的執行效率(不考慮優化的話).
另外你的main函數中的用法也存在問題,如果你希望用基類的指針儲存派生類對象,那麼你需要把基類的析構函數聲明為virtual的,否則在delete的時候會出現內存泄漏.