C++11:类的改进

来源:互联网 发布:windows中安装ipython 编辑:程序博客网 时间:2024/06/01 08:47

继承构造

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 0class 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    {    }};
原创粉丝点击