c++进阶---c++三大特性之一------继承

1.如何简单地使用继承?

在这段代码中,D继承了C1和C2,是C1和C2的派生类(子类)。

2.继承过程中变量的继承情况?

从这份代码可以看出,继承的时候所有的变量都继承了,对于使用的情况,实际上就遵循一个简单的原则,取小,例如父类中是private私有,public继承的时候,就不能在子类中直接调用了。在继承这里有个特殊的地方就是在别的地方protected与private没有太多的区别,但是这里如果是保护是最小的话,那么是可以在子类直接使用父类的变量的。

                static对象和父类共享一份!

                友元函数对象是继承不了的!

3.继承后的构造函数

int main() {
	C1 c1;
	return 0;
}

如果加入这个main函数的这段代码去进行调试的话,你会发现先进去的构造函数是先对父类,也就是B进行构造函数,然后再对C1进行构造。

对于父类没有提供默认构造的,需要这样进行处理构造函数:

4.析构函数和拷贝构造

4.1.1 子类对象可以直接剪切给父类对象

c++会自动把B中A的父类对象(不会产生临时对象)给要赋值的对象,类似把其中的一部分给了它,有一种剪切的感觉,但是只有引用和指针两种情况可以这么使用,这时的父类对象是可以在virtual处理后是可以访问B和A两种对象的,在多态中会有大用。

4.1.2拷贝构造

正常的拷贝构造就够用了,但是如果需要显示的写拷贝构造的话,因为父类必须调用父类的拷贝构造,在传入父类拷贝构造参数的时候,应该按下图代码这么传:

运用了4.2.1的剪切,可以达到传入s时,实际上传的是s的父类的引用。

4.2.1 隐藏

为了说清楚析构函数,这里得先说清楚覆盖的概念。

之前学过一个概念,叫做函数重载,这个概念的前提是同一个作用域,而覆盖则是在子类和父类中,如果有同名函数,无论参数是否相同,当子类有的时候,就会优先调用子类的函数(对于变量也是一样的道理,函数重载则没有这种限制)。

studen& operator=(const studen& s) {
	_num = s._num;
	tel = s.tel;
	person::operator=(s);
}

在这个代码中,如果没有限定是person类域的话,就会一直调用自己。

4.2.2 析构函数

析构函数在编译器中默认处理为destructor,也就是本来是~person和~studen的,现在也构成了隐藏的关系,所有正常要显示调用的时候,也需要限定类域,但是实际上也不用,因为编译器会自己调用一次person的析构函数,所以是不需要自己再去析构person父类里面东西的。

5.菱形继承

当一个子类继承的父类中父类继承了一个相同的类,就会构成菱形继承,如下:

在这种继承下,要限定类域才能进行正确的访问,或者使用virtual(虚)关键字去进行处理,

在这两个继承同一个的地方,进行virtual限制。

可以看出来被整合成一份了,被单独拎出来了,成了一个c,虽然里面还有,但实际上只剩下一份了。

6 构造一个不能被继承的类

6.1 对构造函数进行pirvate私有处理:

当构造函数被私有处理的时候,继承的权限必定是私有,无法使用构造函数,那么也就无法对子类进行构造,因为子类必定调用父类的构造函数。

6.2 使用final语法进行语法限定:

可以看出已经被限制住了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值