深入C++之对象构造析构

关于基类的几个概念
虚基类:为防止多继承时,基类成员多份存在所使用的虚继承方式(public virtual base),这个基类就被称为虚基类
抽象类:含有(或继承)一个或多个纯虚函数的类是抽象基类

抽象类(abstract class)的设计

抽象类一般隐含作为基类的意思,所以也是抽象基类,抽象类构造函数何时应该被定义:

  • 数据成员的存在的情况下,一般为与继承类共用的数据成员,应该存在初始化数据成员的构造函数。
  • 亦或存在更上层的基类没有默认的构造函数,需要显式调用更上层次的构造函数。
这时构造函数设计为protected足以满足初始化的要求,就是继承类需要调用其,同时符合抽象类不能存在实例对象的要求。

构造函数不能为虚函数的原因有几点:
1 对象实例的创建在构造函数调用之后,而虚函数的虚表的创建在构造函数之后。
2 创建对象的方式包含new,本身就决定了对象会直接调用本身构造函数,虚构造函数没有存在的必要,等还有其他原因。


析构函数的设计
必须定义析构函数,无论是自定义或者编译器生成,因为在继承类析构函数中存在BaseClass::~ BaseClass()这样的静态调用方式,注意这个代码是编译器生成的。
一个最合理的设计是,最上层的基类中析构函数应该声明为virtual类型,同时它不应该被定义为纯虚函数,因为它总是被调用,而至于其是public或者protected则需要看情况,如果在基类中并且不被作为某个继承类的实例对象的引用,即在继承类的外部没有进行析构现象,则protected是合适的,但是最好将析构函数定义为public根合理些。


防止对象的隐式转换:使用 expict关键字进行限制隐式转换。


对象构造与析构的几点要求

1类的初始化构造顺序
置于构造函数初始化列表中的对象必须是该类的基类或非静态对象成员,而不能是基类的对象成员,基类的对象成员应该由基类进行初始化。

所以对继承类对基类成员的构造操作无法影响到基类的构造操作,因为基类的构造在继承类之前,所以依赖于继承类对基类成员的操作后进行的初始化工作需要放到继承类的初始化完成后

2 对象与指针成员的内存管理
2.1 使用malloc后,对象构造的初始化工作必须手动进行。
2.2 同理malloc 后进行手动的初始化工作,同时在 free前进行手动的资源释放工作,因为没有构造析构过程。所以合理的方法是使用new进行对象的动态创建
2.3 在传递对象的地方,常伴随着对象的析构,所以必须重定义拷贝构造函数,与赋值函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值