c++ 继承和组合

本文介绍了C++中构造函数的初始化列表及其使用方法,探讨了构造函数和析构函数的调用顺序,以及不同类型的继承(私有继承和受保护继承)如何影响类的设计。

构造函数的初始化列表

        当创建一个对象时,编译器总是确保调用了所有的子对象的构造函数,如果子对象有自己的默认构造函数,那么编译器可以自动地调用它们。但是,如果子对象没有默认构造函数,或者想改变构造函数的某个默认参数,这就会出现问题,因为这个新类的构造函数没有权利访问这个子对象的私有数据成员,所有不能直接对它们初始化。

解决的方法就是:构造函数初始化列表。

        MyType::MyType(int i) : Bar(i) { //…

       构造函数的初始化表达式允许我们显式地调用成员函数的构造函数,它的主要思想是:在进入新类的构造函数体之前调用所有其它的构造函数。即使编译器可以隐藏地调用默认的构造函数,但在没有对所有的成员对象和基类对象的构造函数进行调用之前,就没办法进入构造函数体,这是C++的一个强化的机制,它确保了,如果没有调用对象(或对象的一部分)的构造函数,就别想往下面进行。

构造函数和析构函数的调用

       构造函数和析构函数与众不同的之处在于每一层函数都被调用。然而对于通常的成员函数,只是这个函数被调用,而它的那些基类版本不会被调用,如果还想调用重新定义过的成员函数的基类版本,则必须显式地去做。

       构造从类层次的最根处开始,而在每一层,首先会调用基类构造函数,然后调用成员对象的构造函数,调用析构函数则严格按照构造函数相反的次序。另外,对于成员对象,构造函数调用的次序完全不受构造函数的初始化表达式的次序影响,该次序是由成员对象在类中声明的次序所决定的。

        构造函数和析构函数用来处理对象的创建和析构操作,但它们只知道对它们特定层次上的对象做些什么。所以,在该类以下各个层次中的所有的构造函数和析构函数都必须被调用,也就是说,构造函数和析构函数不能被继承,必须为每一个特定的派生类分别创建。

继承的层次

       私有继承:通过在基类表中去掉public或则通过显式地声明private,可以私有地继承基类。当私有继承时,我们是“照此实现”,也就是说,创建新类具有基类的所有数据和功能,但这些功能是隐藏的,所以它只是部分内部实现,该类的用户访问不到这些内部功能。

       Protected继承:在理想情况下,private成员总是严格私有的,但在实际的项目中,有时希望某些东西隐藏起来,但仍允许其派生类的成员访问,于是关键字protected派上了用场。它的意思是:“就这个类的用户而言,它是private,但它可被这个类继承来的任何类使用”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值