1. C++多重继承中的第一个问题是二义性的问题。举个例子:C派生于A和B,A和B中都有相同的方法声明或成员,在C中引用这些方法或成员时会出现二义性导致编译失败。解决方法:使用域限定符号::来显示声明方法或成员所属的类。
2. C++多重继承的第二个问题是所谓的“厄运钻石”问题,在上面的例子里加一个条件:A和B都派生于D。当采用一般的派生方法时,C的对象里会出现两个D的实例。虚基类可以解决这个问题。
3. 继承方法只是改变从基类继承得来的成员在派生类中的访问属性,而且这种改变遵循一定的规律。如果按照关键字的约束强度排序public < protected < private,约束方法只会将小于自己的成员属性提升为自己的访问属性等级。比如protected继承方法,只会将基类中访问属性为public的成员修改为protected。
4. 继承中,派生类对基类成员(直接和间接)的访问只受直接基类中该成员的访问属性影响。比如:B以private方式派生于A,C派生于B(何种方式都可以),如果A中原本有一个访问属性为protected的成员m_a,那么由于B中m_a的访问属性是private,C就不能再访问m_a。如果B是以public或protected方式派生于A,那么前面提到的这种限制就不存在。
5. 继承中方法或者成员的命名冲突是不存在的,也就是说重名没有任何关系,只要在引用时不造成二义性就可以了,这样就必须加上类限定符号。不加类限定符号而对这些方法或成员的引用就会指向从自己向继承的反方向数最近的那个定义。
Reference:
1. http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/
2. http://www.learncpp.com/cpp-tutorial/116-adding-changing-and-hiding-members-in-a-derived-class/
3. http://www.learncpp.com/cpp-tutorial/117-multiple-inheritance/
4. http://www.learncpp.com/cpp-tutorial/118-virtual-base-classes/
浙公网安备 33010602011771号