C++11 继承构造函数和委托构造函数

本文介绍C++11中新增的构造函数特性——继承构造函数与委托构造函数。继承构造函数允许子类直接使用基类的所有构造函数,简化了代码编写;委托构造函数则允许在一个类的不同构造函数间相互调用,便于代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、继承构造函数

  如果基类的构造函数很多,那么子类的构造函数想要实现同样多的构造接口必须一一调用基类的构造函数,于是C++11 引入继承构造函数。

class _A
    {
public:
    _A( int _InInt ) {;}
    _A( double _InDouble, int _InInt ) {;}
   _A( float _InFloat, int _InInt, const char* _Char ) {;}
    };

class _B : public _A
    {
public:
   using _A::_A;            // 使用_A中的构造函数
    // Somthing...
    virtual void _ExtraInterface() {;}
    };

  仅仅使用using _A::_A 就把基类中的构造函数都继承到子类B中。

1、 C++11中的继承构造函数特性最有用的场合就是,派生类只是在基类的基础上添加了几个新的接口, 这个时候继承构造函数最能够展现威力.但是缺陷就是, 继承构造函数只会初始化基类中的成员变量(毕竟只是从基类继承下来的), 对于派生类中的变量无能为力.(可以使用C++11的新特性:数据成员就地初始化,解决派生类数据成员初始化的问题)。
2、 一旦子类继承了基类的构造函数,那么子类就不会自动生成默认构造函数。

struct _Base 
{ 
    _Base( int ) {} 
};

struct _Derived : _Base 
{ 
    using _Base::_Base; 
};

int main( int _Argc, char* *_Argv ) 
{
    _Derived __derived; // 编译失败, 因为_Derived继承了_Base的构造函数所以_Derived 没有提供的默认构造函数 
    return 0; 
}

二、委托构造函数

  委托构造函数允许构造函数调用同一个类的其他构造函数,该构造函数必须放在构造函数初始化列表中使用。

#include <iostream>  
using namespace std;  
class A  
{  
private:  
    int i=5;  
    string str="初始值";  
public:  
    A(){  
        str="委托构造函数";  
        i=99;  
    }  
    A(int ii):A(){  
    /*不能写成AA(int ii):A(),i(ii)    
    委托构造函数不能再利用初始化器初始化其他数据成员*/  
        i=ii;             
    }  
    void show(){  
        cout<<"i="<<i<<",str="<<str<<endl;  
    }  
};  
int main()  
{  
    A a(10);  
    a.show();  
}  

  使用委托构造函数时,注意不要形成递归委托。例如:

#include <iostream>  
using namespace std;  
class A  
{  
private:  
    int i=5;  
    string str="初始值";  
public:  
    A(string ss):A(555){  
        str=ss;  
    }  
    A(int ii):A("OK"){  
        i=ii;             
    }  
    /* A(string) 和 A(int) 构造函数就形成了递归委托*/
    void show(){  
        cout<<"i="<<i<<",str="<<str<<endl;  
    }  
}; 

int main()  
{  
    A a(10);  
    a.show();  
}   

  包含递归委托的代码程序编译正常,但是在运行时会崩溃(内存问题)。
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值