C++委托构造函数和继承构造函数

委托构造函数

        C++11允许在一个构造函数的定义中使用另一个构造函数来简化编码工作。这被称为委托,因为构造函数暂时将创建对象的工作委托给另一个构造函数。

class employee {
    int m_id;
    string m_name;
public
    employee(int id = 0, const string &name = " ") : m_id(id), m_name(name) { }
    /*使用其他的构造函数来完成数据成员的初始化。下面的这个构造函数是一个委托构造函数。*/
    employee(const string &name) : employee(0, name) { }
};

继承构造函数

        为了进一步简化编码工作,C++11提供了一种让派生类能够继承基类构造函数的机制。在C++98中提供了一种语法:使用using声明让基类的非特殊成员对派生类可用。

//使用using声明需要注意派生类只能为它可以访问的名字提供using声明
class Base {
public:
    int fn(int j) {...}
    double fn(double w) {...}
    void foo(int) {...}
};

class Derv : public Base {
public:
    /*using声明语句只需要提供一个名字,不需要形参列表。*/
    using Base::fn;
    double fn(double) {...}
    int foo(double) {...}
};

Derv d;
/*和其他作用域命名冲突一样,如果派生类成员和基类的成员名字相同(如果成员函数,只要名字相同就会
隐藏不用看返回值和形参),那么定义在派生类的名字将会屏蔽掉基类的名字(基类的成员被隐藏),如果在
派生类里面需要访问基类的同名成员有二种办法,一种是使用基类的作用域运算符,另一种是在派生类中
使用using声明。*/
int k = d.fn(3);    //uses Base::fn(int)
double z = d.fn(2.4);    //uses Derv::fn(double)
d.Base::foo(10);    //调用Base::foo

        在C++11中,将这种方法应用于构造函数。这让派生类继承的所有构造函数(默认构造函数、复制构造函数和移动构造函数除外)

class BS {
    int q;
    double w;
public:
    BS() : q(0), w(0) {}
    BS(double x) : q(-1), w(x) {}
    BS(int k, double x) : q(k), w(x) {}
}

class DR : public BS {
    short j;
public:
    using BS::BS;
    DR() : j(-100) {}
    DR(double x) : BS(2*x), j(int(x)) {}
}

int main()
{
    DR o1;    //use DR()
    DR o2(19.22);    //use DR(double)
    /*由于没有构造函数DR(int,double),因此创建DR对象o3时,将使用继承来的BS(int, double)*/
    DR o3(10, 1.2);    //use BS(int double)
}

        这里需要注意,继承的基类构造函数只初始化基类成员;如果还要初始化派生类成员,则应使用成员列表初始化语法;

DR(int i, int k, double x) : j(i), BS(x, x) {}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张帅峰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值