欢迎来到天天文库
浏览记录
ID:34600612
大小:2.34 MB
页数:74页
时间:2019-03-08
《c++编程思想_部分4new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、352C++编程思想下载第16章多重继承353下载354C++编程思想下载基类persistent的纯虚函数在派生类中必须被重载以执行正确的读写运算。假若我们已经知道data是持久的,可以直接继承它并在那里重载虚函数,因而可不必使用多重继承。本例的思想是在于我们不拥有data的代码,这些代码在别处已经创建了,它可能是其他类层次的一部分(我们不能控制它的继承)。然而,为了使这个方案能正确地工作,我们必须对下层实现能访问,使得它能被存放,所以我们使用了protected。类wdata1和wdata2使用了常见的IO流插入器和取出器以便向流对象存储和从流对象取回data的保护性
2、数据。在write()中,我们可以看到每个浮点数后都加了一个空格,这对读入数据的分解是必要的。类conglomerate不仅继承了data,而且拥有两个wdata1和wdata2类型的成员对象及一个字符串指针。另外,由persistent派生的所有类也包含一个VPTR,所以该例子揭示了使用持久性所遇到的一些问题。当创建write()和read()函数对时,read()函数必须对发生在write()期间的东西进行准确镜像,所以可通过read()抽取磁盘上由write()安置的比特流。这里的第一个问题是char*,它指向一个任意长的字符串。对字符串进行计算并在磁盘上存储其长度
3、,这可使read()函数能正确地分配存储容量。当拥有的子对象具有read()和write()成员函数时,我们所需要做的是在新的函数read()和write()中调用基类的成员函数。它的后面跟着基类直接存储的成员函数。人们在自动持久性方面已竭尽全力。例如,定义类时创建了修改过的预处理器以支持“持久性”主题。你可以想出一个实现持久性更好的方法,但上述方法的优点是它在C++实现下工作,无需特别的语言扩展,相对较健壮。16.7避免MI在PERSIST2.CPP中对多重继承的使用有一点人为的因素,它考虑到在项目中一些类代码不受程序员控制的情况。对以上的例子进行细查,可以看到,通过使
4、用data类型的成员对象以及把虚read()和write()成员放入data或wdata1和wdata2中而不是置于一个独立的类中,这样MI是可以避免使用的。语言会包含一些不常用的特性,这种特殊性只有在其他方法困难或者不可能处理时才使用。当出现是否使用多重继承的问题时,我们可以先问自己两个问题:1)我们有必要同时使用两个类的公共接口吗,是否可在一个类中用成员函数包含这些接口呢?2)我们需要向上映射到两个基类上吗?(当然,在我们有两个以上的基类被应用。)第16章多重继承355下载如果我们对以上两个问题都能以“不”来回答,那么就可以避免使用MI。需要注意,当类仅仅需要作为一个
5、成员参数被向上回溯的情况。在这种情况下,该类可以被嵌入,同时可由新类的自动类型转化运算符产生一个针对被嵌入对象的引用。当将新类的对象作为参数传给希望以嵌入对象为参数的函数时,都将发生类型转换。然而类型转换不能用于通常的成员选择,这时需要继承。16.8修复接口使用多重继承的最好的理由之一是使用控制之外的代码。假定已经拥有了一个由头文件和已经编译的成员函数组成的库,但是没有成员函数的源代码。该库是具有虚函数的类层次,它含有一些使用库中基类指针的全局函数,这就是说它多态地使用库对象。现在,假定我们围绕着该库创建了一个应用程序并且利用基类的多态方式编写了自己的代码。在随后的项目开
6、发或维护期间,我们发现基类接口和供应商所提供的不兼容:我们所需要的是某虚函数而可能提供的却是非虚的,或者对于解决我们的问题的基本虚函数在接口中根本不存在。假若有源代码则可以返回去修改,但是我们没有,我们有大量的依赖最初接口的已生成的代码,这时多重继承则是极好的解决方法。下面的例子是所获得的库的头文件:假定库很大并且有更多的派生类和更大的接口。注意,它包含函数A()和B(),以基类指针为参数。下面是库的实现文件:356C++编程思想下载在我们的项目中,这些源代码是不能得到的,而我们得到的是已编译过的VENDOR.OBJ或VENDOR.LIB文件(或系统中相应的等价物)。使用
7、该库会产生问题。首先析构函数不是虚的,这实际上是创建者的一个设计错误。另外,第16章多重继承357下载f()也不是虚的,这可能是库的创建者认为没有必要。但是我们会发现基类接口失去了解决前述问题的必要能力。假若我们已经使用已存在的接口(不包含函数A()和B(),因为它们不受控制)编制了大量代码,而且并不打算改变它。为了补救该问题,我们可以创建自己的类接口以及从我们的接口和已存在的类中进行多重继承,以便生成一批新类:358C++编程思想下载在mybase(它不使用MI)中,f()和析构函数都改成虚的,并在接口中增加了新的虚函数g(
此文档下载收益归作者所有