- 通过
using
可以方便的使用父类的构造函数和其他函数; - 优先使用子类的构造和函数,如果没有找到匹配的才会调用基类的;
- 可在子类的初始化列表中调用父类的构造函数,并对子类的成员进行列表初始化;
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 *)