本文主要是介绍Effective C++_40.明智而审慎地使用多重继承,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 当多重继承MI进入设计景框,程序很可能从一个以上的Base class继承相同的名称(如函数,typedef等),那会导致较多的歧义;
2. 歧义调用与C++用来解析重载函数调用的规则相符:在看到是否有个函数可取用之前,C++首先确认这个函数对此调用而言是最佳匹配;找出最佳匹配后才检验其可用性;如果两个基类有相同的成员函数,这两个成员函数是有相同的优先级的;
3. 为了解决这个歧义,你必须明白指出你要调用哪一个baseclass内的函数;
Derived.Base1::function();
4. 多重继承的意思是继承一个以上的base classes,但这些base classes并不常在继承体系中又存在相同的更高级的base classes,这样会导致要命的“钻石型多重继承”;
(1) 任何时候,如果一个基类被两个类A,类B继承,而类C又同时继承A,B,那么就必须面对这样的问题:是否打算让最上层base class内的成员变量经由每一条路径被赋值;
(2) C++缺省做法是执行复制;如果那不是你想要的,必须令那个带有此数据的最上层class成为一个virtual base class;为了这么做,必须令所有直接继承自它的classes采用virtual继承;
class CBase{…};
class A : virtual public CBase{…};
class B : virtual public CBase{…};
class C : public A, public B {…};
(3) 规则:遇到钻石型多重继承,任何时候当使用public继承,请改用virtual public继承;
(4) 为避免继承得来的成员变量重复,编译器必须提供若干幕后戏法,其后果是使用virtual继承的class对象往往体积更大,访问速度也更慢;
(5) virtual base的初始化责任是由继承体系中的最底层class 负责,这暗示:
1) class若派生自virtual bases而需要初始化,必须认知其virtual bases,不论那些bases距离多远;
2) 当一个新的derived class加入继承体系中,它必须承担其virtual bases(不论直接或间接)的初始化责任;
5. 对virutal base classes的忠告:
(1) 非必要不要使用virtual bases,平时使用non-virtual继承;
(2) 如果必须使用virtual baseclasses,尽可能避免在其中放置数据,防止在这些classes身上的初始化(和赋值)所带来的诡异的事情;
6. 多重继承只是面向对象工具箱里的一个工具而已;和单一继承比较,它通常比较复杂,使用上也比较难以理解;
总结:
1. 多重继承比单一继承复杂,它可能导致新的歧义性,以及对virutal继承的需要;
2. virtual继承会增加大小,速度,初始化(及赋值)复杂度等等成本;如果virtual base classes不带任何数据(java和.net的Interface类似),将是最具有实用价值的情况;
3. 多重继承的确有正当用途;其中一个情节涉及“public继承某个Interface class”和”private继承某个协助实现的class(工厂模式的一种实现方式)的两相组合;”
这篇关于Effective C++_40.明智而审慎地使用多重继承的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!