继承构造函数

在 c++中有一个规则,如果派生类使用基类的成员函数,可以通过 using 声明来完成,如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>

using namespace std;

struct Base {
    void fun(double i) {
        cout << "Base:" << i << endl;
    }
};

struct Derived : Base {
    using Base::fun;
    void fun(int i) {
        cout << "Derived:" << i << endl;
    }
};

int main() {
    Base b;
    b.fun(4.5);  // Base:4.5

    Derived d;
    d.fun(4.5); // Base:4.5
    d.fun(1);   // Derived:1
    return 0;
}

在派生类 Derived 中使用 using 声明,派生类就拥有了两个 fun 函数的版本。派生类传入浮点字面常量 4.5,结果会调用基类的版本。在 c++11 中,这个想法被扩展到了构造函数上,子类可以通过使用 using 声明来声明继承基类的构造函数。继承构造函数只会初始化基类的成员变量,对于派生类的成员变量则无能为力。