单继承派生类构造函数与析构函数顺序

派生类构造函数形式:

派生类构造函数 (参数表):基类构造函数(参数表)
    类对象成员1(参数表)... 类对象成员n(参数表)//只能用表达式的方式对类对象成员进行初始化
    {...派生类自定义的数据成员初始化}

在派生类中,首先调用基类的构造函数,其次调用对象成员所属类的构造函数,最后调用派生类自己的构造函数,析构函数调用顺序与上述相反。

下面来看一段代码:

#include <iostream>
using namespace std;

class Num
{
    private:
        float n;
    public:
        Num(float x)
        {
            n = x;
            cout<<"I'm a son."<<endl;
        }
};
class Father
{
    protected:
        int a,b;
    public:
        Father(int x,int y)
        {a = x;b = y;}
        //Father(){}
        ShouValue()
        {
            cout<<a<<" "<<b<<endl;
        }
};
class Son : public Father
{
    private:
        Num nu;
        int c,d;
    public:
        Son(int w,int x,int y,int z,int zz):Father(w,x),
        nu(zz)
        {a = w;b = x;c = y;d = z;}
        ShouValue()
        {
            cout<<c<<" "<<d<<endl;
        }
};
int main(void)
{
    Father v1(1,2);
    Son v2(3,4,5,6,7);
    v1 = v2;
    v1.ShouValue();
    v2.ShouValue();
    v2.Father::ShouValue();
return 0;
}

分析:Son是基类Father的单继承派生类,Num是Son的一个子类(相对于组合类而言),从上述代码可以看出,继承与组合有相似的地方,Son继承了Father,所以Son中具有Father的数据成员a,b,同时Num与Son组合,那么Son中就具有了Num中的float e这个数据成员,所以初始化的时候有相似的地方,都是使用表达式初始化。

上述代码中Son的构造函数为:

Son(int w,int x,int y,int z,int zz):Father(w,x),nu(zz)

{c = y;d = z;}

我们还可以写为:

Son(int w,int x,int y,int z,int zz):,nu(zz)

{a = w;b = x;c = y;d = z;}

但是这个时候就要在Father中添加一个无形参的构造函数Father(){},因为在Son的构造函数中把基类的构造函数省略了。

猜你喜欢

转载自blog.csdn.net/rong_bao_bao/article/details/84195981
今日推荐