c++11新特性_c++11(7)新特性之继承构造函数

1)派生类继承基类构造的简化

c++98的使用基类有参构造的通用写法:

基类A构造函数有参数,派生类D就必须定义对于的有参构造,再传递给A。

#include "stdafx.h"
#include <iostream>

using namespace std;

struct A
{
	A(int i) {
		cout << "A construction" << endl;
	};
};

struct D:A
{
	D(int i) :A(i) {
		cout << "D construction" << endl;
	}
};


void main() {
	D d(1);
}

c++11语法:

cb949b648193510625d00ab9530ce370.png

通过using A::A的声明,把基类的构造函数悉数继承到派生类中。可以理解为,使用后把对于的基类的构造函数给隐式声明了。

2) 继承构造函数冲突的处理方法

类的构造函数继承是要求有唯一性的,比如

#include "stdafx.h"
#include <iostream>

using namespace std;

struct A
{
	A(int i) {
		cout << "A construction int " <<i<< endl;
	};
};

struct  B
{
	B(int i) {
		cout << "B construction int " << i << endl;
	};
};

struct D : A,B
{
	using A::A;
	using B::B;
};


void main() {
	D d(1);
}


会出现下图错误,意思是已经继承了A的构造就不能再继承B的构造函数。

0fd002c3786aaebcdab90d41136e1e51.png

处理办法:添加显式声明,我在VS2017下测试不成功,在g++下面没有验证。

struct D : A,B
{
	using A::A;
	using B::B;
        D(int){};
};

3)使用继承构造函数后,派生类的构造函数没有调用问题

class Base
{
public:
	Base() {};
	Base(int a) {};
	~Base() {};

private:

};


class Drived : Base
{
	using Base::Base; //继承base的所有构造函数
public:
	
	Drived() {}; //程序运行后没有执行
	~Drived() {};

private:

};

void main() {
	Drived * c = new Drived(1);


}

后来在派生类中添加同样参数的构造函数才能执行。

class Base
{
public:
	Base() {};
	Base(int a) {};
	~Base() {};

private:

};


class Drived : Base
{
	using Base::Base; //继承base的所有构造函数
public:
	Drived(int a) {}; //添加了这句,并且执行了这条
	Drived() {}; //程序运行后没有执行
	~Drived() {};

private:

};

void main() {
	Drived * c = new Drived(1);


}

从上面的例子看出,在使用了继承构造函数后,

如果派生类构造中没有匹配的构造函数,那么就不会被调用,而是直接调用了基类的构造函数,并且把参数传递给了基类。

如果派生类构造函数中有匹配的构造函数,那么当然会调用,并且会自动调用基类同参数构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值