当前位置:嗨网首页>书籍在线阅读

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) {}