一、继承构造函数
如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口必须一一调用基类的构造函数,于是C++11 引入继承构造函数。
class _A
{
public:
_A(int _InInt) { ; }
_A(double _InDouble, int _InInt) { ; }
_A(float _InFloat, int _InInt, const char* _Char) { ; }
};
class _B : public _A
{
public:
using _A::_A; // 使用_A中的构造函数
virtual void _ExtraInterface() { ; }
};
仅仅使用using _A::_A 就把基类中的构造函数都继承到子类B中。
1、 C++11中的继承构造函数特性最有用的场合就是,派生类只是在基类的基础上添加了几个新的接口, 这个时候继承构造函数最能够展现威力.但是缺陷就是, 继承构造函数只会初始化基类中的成员变量(毕竟只是从基类继承下来的), 对于派生类中的变量无能为力.(可以使用C++11的新特性:数据成员就地初始化,解决派生类数据成员初始化的问题)。
2、 一旦子类继承了基类的构造函数,那么子类就不会自动生成默认构造函数。如下所示:
struct _Base
{
_Base(int) {}
};
struct _Derived : _Base
{
using _Base::_Base;
};
int main(int _Argc, char* *_Argv)
{
_Derived __derived; // 编译失败, 因为_Derived继承了_Base的构造函数所以_Derived 没有提供的默认构造函数
return 0;
}
二、委托构造函数
委托构造函数允许构造函数调用同一个类的其他构造函数,该构造函数必须放在构造函数初始化列表中使用。
#include <iostream>
using namespace std;
class A
{
public:
A() {
str = "委托构造函数";
i = 99;
}
A(int ii) :A() {
/*不能写成AA(int ii):A(),i(ii)委托构造函数不能再利用初始化器初始化其他数据成员*/
i = ii;
}
void show() {
cout << "i=" << i << ",str=" << str << endl;
}
private:
int i = 5;
string str = "初始值";
};
int main()
{
A a(10);
a.show();
}
使用委托构造函数时,注意不要形成递归委托。例如:
#include <iostream>
using namespace std;
class A
{
public:
A(string ss):A(555){
str=ss;
}
A(int ii):A("OK"){
i=ii;
}
/* A(string) 和 A(int) 构造函数就形成了递归委托*/
void show(){
cout<<"i="<<i<<",str="<<str<<endl;
}
private:
int i=5;
string str="初始值";
};
int main()
{
A a(10);
a.show();
}
包含递归委托的代码程序编译正常,但是在运行时会崩溃(内存问题)。