13 继承构造函数

继承构造函数

​ 在某些情况下,子类仅仅是添加了一个特别的方法,但与父类构造函数基本一致。此时如果父类拥有大量构造函数,子类就同样要复制它们,仅仅为了转发构造参数。为此,C++11提出了继承构造函数的概念。

1. 使用继承构造函数

​ 在C++11中对using进行了拓展,使之拥有将基类的函数引入派生类的功能:

class Base
{
public:
void foo(int) {}
};

class Derived : public Base
{
public:
using Base::foo;
void foo(char *) {}
};

int main()
{
Derived d;
d.foo(5);
}

​ 因此,可以使用其引入基类的构造函数:

class Base
{
public:
Base() : x_(0), y_(0.) {}
Base(int x, double y) : x_(x), y_(y);
Base(int x) : x_(x), y_(0.) {}
Base(double y) : x_(0), y_(y) {}

private:
int x_;
double y_;
};

class Derived : public Base
{
public:
using Base::Base;
};

2. 继承构造函数的注意点

  • 只有程序中使用了继承的构造函数,编译器才会为派生类生成继承构造函数

  • 派生类不会继承基类的默认构造函数和复制构造函数

  • 继承构造函数不会影响派生类生成默认构造函数

  • 派生类中声明签名相同的构造函数会禁止继承相应的构造函数

  • 派生类继承多个基类的相同签名的构造函数会报错

  • 继承构造函数的基类构造函数不能是私有