继承
类就是分类的标准,也就是一类事物,一类具有相同属性和行为对象的抽象。比如动物就是一个类,它描述了所有具有动物这个属性的事物的集合。狗也是一个类,它具有动物所有的特性,我们说狗这个类继承了动物这个类,动物是狗的父类,狗是动物的子类。在C语言中也可以模拟继承的效果,比如:
struct Animal {
...
};
struct Dog {
struct Animal animal;
...
}
struct Cat {
struct Animal animal;
...
}
因为C语言也可以实现『继承』,所以Bob大叔认为『继承』也不算不上是面向对象的『特性』。但是我觉得,C语言中实现『继承』的方式,需要用面向对象的思维来思考才能理解,否则纯粹从数据结构的方式来看上面的例子,理解起来就会大相径庭:animal是Dog的一个成员,所以Animal可以看成是Dog的一部分!Is a 变成了has a。只有在面向对象的思想中,说『继承』才有意义,所以说『继承』是面向对象的『特性』并不牵强。
在C语言里实现多重继承更是非常麻烦了,记得glib里实现了接口的多重继承,但是用起来还是挺别扭的,对新手来说更是难以理解。多重继承在某些情况下,会对编译器造成歧义,比菱形继承结构:A是基类,B和C是它的两个子类,D从B和C中继承过来,如果B和C都重载了A的一个函数,编译器此时就没法区分用B的还是C的了(当然这是可以解决的)。
像Bob大叔说的,Java没有实现多重继承,并不是多重继承没有用。而是为了简化编译器的实现,C#没有实现多重继承,则是因为Java没有实现多重继承:)
除了接口多重继承是必不可少的,类的多重继承在现实中也是很常见的。比如:狼和狗都是狗科动物的子类,猫和老虎都是猫科动物的子类。狗科动物和猫科动物都是动物的子类。但是猫和狗都是家畜,老虎和狼都是野生动物。猫不但要继承猫科动物的特性,还继承家畜的特性。类就是分类的标准,而混用不同的分类标准是多重继承的主要来源。多重继承可以用其他方式实现,比如traits和mixin。










