1. 通过 using 可以方便的使用父类的构造函数和其他函数;
  2. 优先使用子类的构造和函数,如果没有找到匹配的才会调用基类的;
  3. 可在子类的初始化列表中调用父类的构造函数,并对子类的成员进行列表初始化;
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) {}
    BS(int k, double x) : q(k), w(x) {}
    void Show() const {
        std::cout << q <<", " << w << '\n';
    }
    
    int fn(int j) {
        cout << "BS::fn(int)\n";
        return 0;
    }
    double fn(double w) {
        cout << "BS::fn(double)\n";
        return 0;
    }
    void fn(const char * s) {
        cout << "BS::fn(const char *)\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();
    }
    
    using BS::fn;  // 如果不用 using,父类的 fn 会被隐藏
    double fn(double w) {
        cout << "DR::fn(double)\n";
        return 0;
    };
};
int main()
{
    DR o1; // use DR()
    o1.Show();  // -100, 0, 0
    DR o2(18.81); // use DR(double) instead of BS(double)
    o2.Show(); // 18, -1, 37.62
    DR o3(10, 1.8); // use BS(int, double)
    o3.Show(); // 随机值, 10, 1.8
    
    o3.fn(1); // use BS::fn
    o3.fn(1.1); // use DR::fn
    o3.fn("Uh"); // use BS::fn
}

输出:

-100, 0, 0
18, -1, 37.62
24016, 10, 1.8
BS::fn(int)
DR::fn(double)
BS::fn(const char *)