22-继承构造函数
18.3.4 继承构造函数
为进一步简化编码工作,C++11提供了一种让派生类能够继承基类构造函数的机制。C++98提供了一种让名称空间中函数可用的语法:
namespace Box
{
int fn(int) { ... }
int fn(double) { ... }
int fn(const char *) { ... }
}
using Box::fn;
这让函数fn的所有重载版本都可用。也可使用这种方法让基类的所有非特殊成员函数对派生类可用。例如,请看下面的代码:
class C1
{
...
public:
...
int fn(int j) { ... }
double fn(double w) { ... }
void fn(const char * s) { ... }
};
class C2 : public C1
{
...
public:
...
using C1::fn;
double fn(double) { ... };
};
...
C2 c2;
int k = c2.fn(3); // uses C1::fn(int)
double z = c2.fn(2.4); // uses C2::fn(double)
C2中的using声明让C2对象可使用C1的三个fn() 方法,但将选择C2而不是C1定义的方法fn(double)。
C++11将这种方法用于构造函数。这让派生类继承基类的所有构造函数(默认构造函数、复制构造函数和移动构造函数除外),但不会使用与派生类构造函数的特征标匹配的构造函数:
class BS
{
int q;
double w;
public:
BS() : q(0), w(0) {}
BS(int k) : q(k), w(100) {}
BS(double x) : q(-1), w(x) {}
B0(int k, double x) : q(k), w(x) {}
void Show() const {std::cout << q <<", " << w << '\n';}
};
class DR : public BS
{
short j;
public:
using BS::BS;
DR() : j(-100) {} // DR needs its own default constructor
DR(double x) : BS(2*x), j(int(x)) {}
DR(int i) : j(-2), BS(i, 0.5* i) {}
void Show() const {std::cout << j << ", "; BS::Show();}
};
int main()
{
DR o1; // use DR()
DR o2(18.81); // use DR(double) instead of BS(double)
DR o3(10, 1.8); // use BS(int, double)
...
}
由于没有构造函数DR(int, double),因此创建DR对象o3时,将使用继承而来的BS(int, double)。请注意,继承的基类构造函数只初始化基类成员;如果还要初始化派生类成员,则应使用成员列表初始化语法:
DR(int i, int k, double x) : j(i), BS(k,x) {}