C++11:类的改进

继承构造

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 0
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
    {

    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值