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++之继承(多重继承+多继承+虚继承+虚析构函数+重定义)

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

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

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

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

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

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

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

C++中的虚析构

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

【笔试面试知识点查缺补漏深入理解之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
  • 1207

C++知识点随笔(六):模板

一、函数模板C++中模板和重载的区别: 模板是除了类型全都相同的情况下可以使用;而重载是里面的功能也有不同时使用的。 下面看一个函数模板的使用实例:#include using namespace...

C++知识点随笔(三):static、const、friend、inline

一、static静态成员属性为什么要在类外初始化? 静态成员属性之所以不能在构造函数内初始化,是因为构造函数必须要在定义对象的时候才会调用,而static变量在编译的时候就创建了,所以要在类外通过类...

C++知识点随笔(七):成员函数指针、模拟虚函数列表

成员函数指针普通的全局函数指针定义:typedef void (*PFUN)();普通的函数指针可以指向返回值和参数类型都相同的全局函数,可是成员函数该怎么办呢?如果成员函数是static的,那么可以...

C++new/delete相关知识点详解

每个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。C语言用一堆标准库函数malloc和free在自由存储区中分配...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++知识点随笔(四):耦合问题、new和malloc、虚析构、多继承
举报原因:
原因补充:

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