在C++的继承关系中,只有虚函数能够被继承,而构造函数不能够是虚函数,因此构造函数不能被继承,可是能够经过某种特殊手段,达到继承的效果。ios
先看看C++中using关键字的一个应用 函数
1 #include <iostream> 2 using namespace std; 3 4 struct Base { 5 void f(double i) {cout << "Base: " << i << endl;} 6 }; 7 8 struct Derived : Base { 9 using Base::f; 10 void f(int i) {cout << "Derived: " << i << endl;} 11 }; 12 13 int main() { 14 Base b; 15 b.f(4.5); 16 Derived d; 17 d.f(4.5); 18 }
打印结果以下:spa
第9行和第10行为Derived类定义了两个版本的f函数,无论你知道或是不知道,奇怪或是不奇怪,结果就是这样,这就是using关键字的一个小应用。code
而C++11利用using关键字这一特色,是构造函数能够被“继承”。blog
1 struct A { 2 A(int i){} 3 A(double d, int i){} 4 A(float f, int i, const char* c){} 5 }; 6 7 struct B:A { 8 using A::A; 9 int d{0}; 10 }; 11 12 int main() { 13 B b(217); // b.d被初始化为0,这是C++11的变量初始化 14 //B b1; // 使用继承构造函数的类,编译器不会为其生成默认构造函数 15 }
使用继承构造函数特性有一些须要注意的地方:继承
1. 若是基类的构造函数被声明为私有函数,或者派生类是从基类虚继承的,那么就不能使用继承构造函数。编译器
2. 若是一个类使用了继承构造函数,那么编译器将不会为其生成默认的构造函数。io
继承构造函数的特性听说要到g++ 4.8才会被支持,可是个人版本是4.7,因此以上代码还没法编译。编译