这是从翁恺那里听到的,他在一个课程里说的。
这得从 B. Stroustrup创始C++开始了!
C++是自由的,所以,B. Stroustrup就觉得,不应该像别的面向对象语言一样,得从一个根类衍生出所有的其它类,就像JAVA,它是从OBJECT类生成所有其它类的。C++不是,它是从几个方面开始的,有几个类在最顶端,它们是平等的!
标准C++的类与组件,逻辑上分为以下几个:
1、标准C++输入输出类
2、容器类与ADT(抽象数据类型)
3、存储管理类
4、算法
5、错误处理
6、运行环境支持
这六大类是处在最顶的,它们是C++使用时都会用到的类。
就因为这样,所以,C++就不能在没有特别添置功能的情况下,制造出容器来!
因为容器本身,就是放置别的对象的,但是,因为C++的类不是从同一个根类继承来的,它们之间没有通性,因此,不能把它们中的任一个做为容器来存放别的对象。
没办法,只有单独再造一个东东来完成容器的任务了!这样,多继承出现了。多继承使得一个类可以从不同的类继承特性,使它成为容器,放置不同类别的对象。但是,由于多继承的出现,使一个特殊情况成为可能: 菱形继承 ,也就是重复继承,称“ 死亡 菱形”。为了使这一情况得到更正,于是出现了“虚继承”,这样,把父父类定义为虚类,在子子类中使用的时候,才不会出现让编译器搞不清状况的情况。
同样,为了让这种特性变得好用些,又加入了类模板!
这可以说是C++在设计时的一点点小缺陷,因为这个,C++才变得像现在这样难于学习。好多情况下都是因为它的它些特性,才会让程序变得这样复杂。这就是我的一点点看法,有不正确的地方,请高手指点下哦!
附: 菱形继承 的情况
比如:一个类A,有一个方法:Print();
有两个类:B和C,都是从A类继承过来的,然后又有一个类D,它是利用多继承从B和C那里派生出来。那么,在D里调用Print()方法时,就会出问题,因为编译器不知道应该用从B那里过来的方法还是调用从C那里过来的,因为它们都是从A来的啊!形成这样一个 菱形:
A
B C
D
这得从 B. Stroustrup创始C++开始了!
C++是自由的,所以,B. Stroustrup就觉得,不应该像别的面向对象语言一样,得从一个根类衍生出所有的其它类,就像JAVA,它是从OBJECT类生成所有其它类的。C++不是,它是从几个方面开始的,有几个类在最顶端,它们是平等的!
标准C++的类与组件,逻辑上分为以下几个:
1、标准C++输入输出类
2、容器类与ADT(抽象数据类型)
3、存储管理类
4、算法
5、错误处理
6、运行环境支持
这六大类是处在最顶的,它们是C++使用时都会用到的类。
就因为这样,所以,C++就不能在没有特别添置功能的情况下,制造出容器来!
因为容器本身,就是放置别的对象的,但是,因为C++的类不是从同一个根类继承来的,它们之间没有通性,因此,不能把它们中的任一个做为容器来存放别的对象。
没办法,只有单独再造一个东东来完成容器的任务了!这样,多继承出现了。多继承使得一个类可以从不同的类继承特性,使它成为容器,放置不同类别的对象。但是,由于多继承的出现,使一个特殊情况成为可能: 菱形继承 ,也就是重复继承,称“ 死亡 菱形”。为了使这一情况得到更正,于是出现了“虚继承”,这样,把父父类定义为虚类,在子子类中使用的时候,才不会出现让编译器搞不清状况的情况。
同样,为了让这种特性变得好用些,又加入了类模板!
这可以说是C++在设计时的一点点小缺陷,因为这个,C++才变得像现在这样难于学习。好多情况下都是因为它的它些特性,才会让程序变得这样复杂。这就是我的一点点看法,有不正确的地方,请高手指点下哦!
附: 菱形继承 的情况
比如:一个类A,有一个方法:Print();
有两个类:B和C,都是从A类继承过来的,然后又有一个类D,它是利用多继承从B和C那里派生出来。那么,在D里调用Print()方法时,就会出问题,因为编译器不知道应该用从B那里过来的方法还是调用从C那里过来的,因为它们都是从A来的啊!形成这样一个 菱形:
A
B C
D