[C++11阅读]继承构造函数和委派构造函数
2020-05-20 本文已影响0人
凌霄阁2010
在我看来C++构造函数已经够复杂了,继承构造和委派构造,包括下一篇要提到的移动构造,使情况变得更复杂,对新手更不友好。
C++11新特性继承构造函数和委派构造函数主要用于比较复杂的类,包含多个成员变量,动辄好几个构造函数的那种类,可以减少构造函数的个数,缩短代码。而移动构造函数是用来提升代码执行效率的,与本篇提到的二者出发点不同,分开两篇讨论。
继承构造函数
简单的说,用一句话可以把基类的构造函数如数继承下来。
有的基类构造函数特别复杂,众所周知,派生类是不会继承基类构造函数的。之前C++有个规则是可以通过using调用基类的成员函数,C++11把它扩展到了构造函数。
struct A
{
A(int i) {}
A(double d, int i) {}
A(float f, int i, const char* c) {}
};
struct B : A
{
using A::A; // 继承构造函数
virtual void ExtraInterface(){}
};
实测g++编译也能过,但会报一句“inheriting constructors only available with -std=c++11”
委派构造函数
就是把公共需要初始化的变量抽出来放在一个构造函数里,称为目标构造函数,其他构造函数在初始化列表中调用目标构造函数,称为委派构造函数。就好比有一个公共的被委托人,其他人委托他去做一些公共的事。目标构造函数可以有多个。
委派构造函数只能在初始化列表中调用目标构造函数,不能在函数体里调用。
值得注意的是,委派构造函数不能在初始化列表里写其他成员变量的初始化了。
class Info
{
public:
Info() : Info(1, 'a') {}
Info(int i) : Info(i, 'a') {}
Info(char e) : Info(1, e) {}
private:
Info(int i, char e) : type(i), name(e)
{/* other initialize */ }
int type;
char name;
};
实测g++编译也能过,但会报一句“delegating constructors only available with -std=c++11”