委托构造函数
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中,将这种方法应用于构造函数。这让派生类继承的所有构造函数(默认构造函数、复制构造函数和移动构造函数除外)文章来源:https://www.toymoban.com/news/detail-539510.html
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)
}
这里需要注意,继承的基类构造函数只初始化基类成员;如果还要初始化派生类成员,则应使用成员列表初始化语法;文章来源地址https://www.toymoban.com/news/detail-539510.html
DR(int i, int k, double x) : j(i), BS(x, x) {}
到了这里,关于C++委托构造函数和继承构造函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!