c++继承时的构造、析构、和拷贝构造函数

一:继承后子类的构造函数的写法及调用顺序

 1.写法

一般语法形式为:

  派生类名::派生类名(参数表):基类名1(基类初始化参数表),基类名1(基类初始化参数表),...........................

{     

         派生类构造函数中的其他语句

}

2.调用顺序

原则:

 1.先调用基类,为基类初始化,(如果有其他类的内嵌对象,则第二步调用内嵌对象的构造函数)最后再执行子类构造函数体中的语句。

 2.多个基类时按照继承时的先后顺序调用,而不是按照初始化列表中的顺序调用。

 3.派生类的构造函数就是为基类传递参数的通道。对于需要给予参数来初始化的基类,必须显示声明在子类构造函数中的初始化列表中,对于使用默认构造函数的基类,则不需要写出对象名和参数表

4.如果有内嵌对象,则按照他们在子类中定义的先后顺序来调用构造函数,反正不管怎么样,和初始化列表没关系。

程序示例:

#include <iostream>
using namespace std;
class base1 {
public:
	base1(int a) {
		cout << "base1 constructor was called " << a << endl;
	}
};
class base2 {
public:
	base2(int b) {
		cout << "base2 constructor was called " << b<< endl;
	}
};
class base3 {
public:
	base3() {
		cout << "base3 constructor was called $" << endl;
	}
};
//注意下面继承时的先后顺序,base2在base1前面,而在构造函数中把base1写到了base2前面。
class derived :public base2, public base1, public base3 {
	base1 b1; 
	base2 b2;//建立三个内嵌对象,他们也得调用构造函数来初始化
	base3 b3;
public:
	derived(int a, int b, int c, int d) :base1(a), b2(d), b1(c), base2(b) {
		cout << "derived constructor was called " << endl;
	}
};
int main() {
	derived d(1, 2, 3, 4);
}

分析:  

 1.先看前三个语句,可以看出是按照继承时候的先后顺序来调用的,初始化列表中没有写base3,但是依然调用base3的构造函数。

2.再看中间那组内嵌对象的构造语句,是按照定义的顺序,也和初始化列表没关系

3.最后执行子类自己的构造函数中的语句

         

 

二:继承时的析构函数

顺序和构造函数的顺序完全相反。 先子类,再内嵌,最后基类。

析构函数可以编译器自己生成,你不写但是不代表析构函数不发挥作用。

 

三.继承时的拷贝构造函数。

如果不自己写,那么系统会自动生成一个隐含的复制构造函数,这个复制构造函数会调用基类的复制构造函数。为数值上的浅复制,涉及到指针的时候还得自己编写复制构造函数(注意不要把自己写的复制构造函数写成和系统生成的一样,那样就没用了)

语法:

derived(const derived &v):base(v){

 

}

可能会有点疑问,v不是derived类型的对象吗?那怎么可以传给base类做参数呢,我base类的构造函数不是base(const base&b)吗?这是因为类型兼容规则,子类的对象可以初始化父类的引用。

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值