继承构造
C++ 11允许派生类继承基类的构造函数(默认构造函数、复制构造函数、移动构造函数除外)。
#include <iostream>
using namespace std;
//基类
class A
{
public:
A(int x, int y)
{
a = x;
b = y;
}
protected:
int a;
int b;
};
//派生类
class B:public A
{
public:
#if 0
//通过参数列表给基类构造函数传参
B(int x, int y): A(x, y)
{
}
#endif
//继承构造
using A::A;
void display()
{
cout << "a = " << a << ", b = " << b << endl;
}
//没有增加新的成员变量
int tmp;
};
int main()
{
//派生类对象
B obj(10, 20);
obj.display();
return 0;
}
注意:
- 继承的构造函数只能初始化基类中的成员变量,不能初始化派生类的成员变量
- 如果基类的构造函数被声明为私有,或者派生类是从基类中虚继承,那么不能继承构造函数
- 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数
委托构造
和继承构造函数类似,委托构造函数也是C++11中对C++的构造函数的一项改进,其目的也是为了减少程序员书写构造函数的时间。
如果一个类包含多个构造函数,C++ 11允许在一个构造函数中的定义中使用另一个构造函数,但这必须通过初始化列表进行操作,如下:
#include <iostream>
using namespace std;
class Test
{
public:
//委托构造,一定要通过初始化列表方式
Test():Test(1, 'a')
{
}
Test(int x): Test(x, 'b')
{
}
Test(char x): Test(11, x)
{
}
int a;
char b;
private:
Test(int x, char y): a(x), b(y)
{
}
};
int main()
{
//Test obj; // Test():Test(1, 'a')
Test obj('z');
cout << obj.a << endl;
cout << obj.b << endl;
return 0;
}
继承控制:final和override
C++11之前,一直没有继承控制关键字,禁用一个类的进一步衍生比较麻烦。
C++ 11添加了两个继承控制关键字:final和override。
final阻止类的进一步派生和虚函数的进一步重写:
//final阻止类的进一步派生,虚函数的进一步重写
#if
class A1 final //加上final,指定A1不能派生
{
int a;
};
class A2: public A1 //err, 基类不能再派生了
{
};
#endif
//基类
class B1
{
public:
virtual void func() final {} //这是最终版本的虚函数,不能再重写
};
//派生类重写基类的虚函数
class B2: public B1
{
public:
//virtual void func() {} //err, 基类中的虚函数是最终版本,不能再重写
override确保在派生类中声明的函数跟基类的虚函数有相同的签名:
class A1
{
public:
//这是第一个虚函数,没有重写,不能用override修饰
virtual int func(int a)
{
}
};
class A2:public A1
{
public:
//在重写虚函数地方,加上override, 要求重写的虚函数和基类一模一样
virtual int func(int b) override