Part6 继承与OOD Inheritance and Object-Oriented Design(三)

Rule40:明智使用多重继承 Use mutiple inheritance judiciously
最先遇到的一个问题是,当MI进入设计时,程序有可能从一个以上的base classes继承相同名称(如函数、typedef等等),那会导致较多的歧义机会。

上面代码中对checkOut的调用是歧义的,即使两个函数之中只有一个可取用(BorrowwableItem内的checkOut是public,ElectronicGadget内的却是private)。这与C++用来解析重载函数调用的规则相符:在看到是否有个函数可取用之前,C++首先确认这个函数对此调用之言是最佳匹配。找到最佳匹配函数后才检验其可取用性,本例的两个checkOuts有相同的匹配程度,没有所谓的最佳匹配。

可以看出在编译环节编译器就报错。
为了解决这个歧义,你必须明白指出你要调用哪一个base class内的函数:
mp.BorrowableItem::checkOut();
mp.ElectronicGadget::checkOut();//此时才会提示访问权限不够

钻石型多重继承
Part6 继承与OOD Inheritance and Object-Oriented Design(三)_第1张图片
这种情况下,假设File class有个成员变量fileName,那么IOFile内该有多少笔这个名称的数据呢?从某个角度说,IOFile从其每一个base class继承一份,所以其对象内应该有两份fileName成员变量。但从另一个角度说,IOFile对象本应该只有一个文件名称,所以它继承自两个base classes而来的fileName不该重复。
C++在这个上面没有倾斜立场:两个方案都支持,默认做法是执行复制,也就是上面的第一种做法。如果那不是你想要的,你必须令那个带有此数据的class(也就是File)成为一个虚基类(virtual base class)。为了这样做,你必须令所有直接继承自它的classes采用“虚继承”。
Part6 继承与OOD Inheritance and Object-Oriented Design(三)_第2张图片

但是 virtual base class的构造需要性能上的消耗,对virtual base class 的忠告很简单。第一,非必要不使用virtual bases。平常请使用non-virtual 继承。第二,如果你必须使用virtual base classes,尽可能避免在其中放置数据。这么一来就不用担心这些classes身上的初始化和赋值带来的问题。

你可能感兴趣的:(Part6 继承与OOD Inheritance and Object-Oriented Design(三))