C++知识点随笔(四):耦合问题、new和malloc、虚析构、多继承

原创 2015年07月08日 09:50:25

一、耦合问题

即互相包含头文件的问题,解决方法:
1. 在一个类的头文件里声明另一个类,那么我们在定义的时候就不能new对象,但是可以定义一个指针。这只是为了保证编译通过,等到具体创建对象的时候还是会使用原来的类成员。
2. 可以抽象出一个父类,让这个父类里面同时包含这两个子类里需要耦合的部分。
3. friend方法,其实也相当于一个声明,但是friend会破坏类的封装性。(传说中友元是不需要头文件的)。
4. 降低耦合性参考:http://developer.178.com/200912/54167815997.html

二、new和malloc的区别

malloc只是在堆区申请空间;
而new里面封装了三件事情:
1. 调用类的构造函数
2. 在堆区申请空间
3. 返回对象的首地址

delete封装了两件事:
1. 调用析构函数
2. 删除指针所指向的全部空间
注意:delete删除空间时一定将new的对象大小全部删除了,但是调用谁的析构就要看这个指针本身的类型了。所以当这种情况时:

CFather *son = new CSon;
delete son;

就不会调用子类的析构函数,从而可能会造成内存泄露。所以要解决这个问题,就有了我们后面的虚析构的诞生。

三、虚析构

虚析构就是当我们delete父类指针的时候,会首先调用子类的析构函数,然后再调用父类的析构函数,这样就保证了所有的子类析构函数都可以调用,从而避免了内存泄露的问题。它的形式是这样的:

virtual ~CFather();

什么时候用虚析构呢?
有多态或者说有virtual的时候就用虚析构。这个虚析构同样也存在于虚函数列表中,子类的析构函数会重写这个表中的虚析构函数指针。注意:虚析构函数指针不一定就在虚函数列表的最后,它和普通虚函数一样,是根据父类中声明的顺序加入虚函数列表的。

为什么调用子类的析构函数之后一定会调用父类的析构函数?
我们之前讲过,子类继承父类的过程其实相当于在最开始的时候定义了一个父类的对象,那么当我们执行完子类的析构函数之后,这个子类就要回收了,所以定义的父类的对象的作用域也就结束了,就会自动调用父类对象的析构函数了。

四、多继承

多继承形式:

class AA : public BB, public CC

多继承的构造顺序是:BB->CC->AA
多继承的所以父类中,从左向右依次执行构造函数。
多继承的缺点:
多继承会出现访问不明确的问题,因为多继承是这样的:
这里写图片描述
所以有两份AA,这样我们在使用AA的成员变量的时候就会发生访问不明确的问题,解决的方法就是使用虚继承,这个我们后面再讲。
另外当我们多继承的父类,即BB和CC同时拥有两个同名的虚函数时,子类也无法将他们重写,还是指向不明确的问题,这个问题我们可以通过嵌套类来解决,后面再讲。
其实多继承的出现本身就是一种缺陷,证明了我们的程序设计的不够完美,所以我们在程序设计的时候尽量避免多继承的出现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

当C++多继承遇上类型转换

1 由来 客户用陈旧的VC++6.0进行项目开发,有一块功能需要我来实现。让一个早就习惯了VS2013的人去使用C++支持不太好的VC6去做开发实在是非常不爽,于是另辟蹊径,打算使用VC++2013开...
  • smstong
  • smstong
  • 2014年04月25日 14:53
  • 4068

<C++略识>之多重继承、多继承、虚继承

问题:什么是多重继承? 定义三个类:人、士兵、步兵,则有:步兵士兵人,这样的关系称之为多重继承,写法如下:class Person { }; classSoldier:publicPerson ...
  • u013003827
  • u013003827
  • 2016年07月22日 22:29
  • 3254

【c++知识归纳】继承与多态(一)

c++是基于面向对象的编程语言,面向对象的三大特性为:封装、继承和多态。本文将我对继承与多态的理解进行了总结归纳,这部分内容对于学习c++编程语言是非常重要的,文章加入我的个人理解,希望能给大家带来帮...
  • XHfight
  • XHfight
  • 2016年08月24日 02:45
  • 1231

C++之继承(多重继承+多继承+虚继承+虚析构函数+重定义)

多重继承和多继承 这个我们来讲讲这两个的概念问题,一字之差,千差万别。 多重继承,比如有三个类,人类-士兵类-步兵类,三个依次继承,这样的继承称为多重继承。class Person {};clas...
  • u013486414
  • u013486414
  • 2017年03月04日 13:07
  • 467

C++知识点随笔(二):继承、多态

一、继承继承是类之间的,对象之间没有什么关系,比如子类继承了父类的成员属性,并且子类的对象修改了这个成员属性,可是修改之后我们再去输出父类的成员属性发现并没有发生改变,原因是这两个对象本来就是两块空间...
  • u012300157
  • u012300157
  • 2015年08月02日 21:09
  • 368

C++知识点随笔(五):虚继承

虚继承的出现就是为了解决多继承中访问不明确的问题。 首先让我们先看一下虚继承的代码:#include using namespace std;class AA { public: int m...
  • u012300157
  • u012300157
  • 2015年08月20日 20:33
  • 308

C2385, C++多继承中的 new delete 不明确问题

在webkit项目中,会经常遇到一些多重继承的类,以及多如牛毛的智能指针。还有一些WTF中定义的宏函数,比如 WTF_MAKE_FAST_ALLOCATED 。 类的多继承中,除了普通函数的 me...
  • camike
  • camike
  • 2017年03月09日 09:46
  • 313

C++多态 & 虚函数 & 虚析构 & 覆盖 & 虚表

静态绑定:互为重载 动态绑定:virtual虚函数,虚表,覆盖 虚析构
  • yuanchunsi
  • yuanchunsi
  • 2017年12月18日 15:39
  • 58

C++中的虚析构

概念我就不说了 直接上代码,有详细的注释 #define _CRT_SECURE_NO_WARNINGS //不加这个编译器报strcpy的错 不知道为什么, #include using na...
  • sum_TW
  • sum_TW
  • 2016年10月30日 23:46
  • 532

【笔试面试知识点查缺补漏深入理解之C与C++篇】C语言中的malloc和free

转自:http://bbs.bccn.net/thread-82212-1-1.html 来自bccn C语言论坛如果不扯得太远的话,比如说操作系统中虚拟内存和物理内存如何运做如何管理之类的知识等我感...
  • ANTON_6
  • ANTON_6
  • 2011年07月25日 15:41
  • 1249
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++知识点随笔(四):耦合问题、new和malloc、虚析构、多继承
举报原因:
原因补充:

(最多只允许输入30个字)