以前都没有过系统的学习c++,当然也就没有深入的接触到标题所提的内容。下面把我学习的过程笔录下来,可能基于刚开设的论坛吧,激起了我的好学心,想把论坛作的更好,但技术跟不上是不行的。我随便提个问题到ds版(因为问题太多,所以随便),斑竹很热心的解答了,但是看后,2个字,郁闷。不是因为别的,我是的确看不懂。认识到问题的严重性,为了以后能和版内人进行沟通,我拾起了书本挑了一本易懂书,钱熊编写的c++程序设计教程。继承的概念非常的easy,且容易理解,毕竟和现实联系很多,一个交通工具->汽车->小汽车->工具车例子便清楚地知道他们的继承关系了,一句话,父亲有的儿子都有(以后的语言可能会加入变异,这样更接近现实。)这种集成是包括属性,操作的。有关他的工作方式书中举了个很好的例子,void fn(student &s ){}函数定义是要接收student类生成的对象的地址,而
class graduatestudent:public student{}这个student的派生类也可以被调用,这一点由他们的内存的布局可以看出,不管是基类,还是派生类,他们在内存的开始都是以基类的对象开始。返回来,函数调用的指针都是指向这块内存的开始,但是对于student和graduatestudent来说,都是一样的。所以他们的地址可以同时作为参数。(需要注意的是,派生类可以访问基类的保护访问成员,甚至在构造时初始化他们,但是一般不这样做,而是用基类的成员函数<又叫接口>来访问和构造,这样做的好处是,一旦基类出现问题,只要借口没有问题那么就不会影响派生类)
       下一步看到了派生构造类,一头雾水暂时跳过,类与类之间的关系分为继承与组合,组合关系是包含与被包含的关系。c++中允许子类的成员函数重载基类的成员函数,这样便出现这样一个问题,在基类student中定义abc()函数,在其派生类graduatestudent中定义abc()函数这两个函数其实是针对不同的泪来进行操作的,而当定义 void fn(student &x){x.abc();}时fn()能接受student的对象,也能接受graduate的对象而对其间函数的调用确实不同的,所以fn()的运行执行代码就无法在编译时被确定,一会儿调用student::abc()一会用graduate::abc()而这是不允许的,而多态性的提出便是解决的方法,它能够依据类型确认调用那个函数的能力,使得编译时就能确定哪个重载函数被调用。语言若不支持多态,则不能称面向对象的。只支持类而不支持多态,称为基于对象的,如vb。
因为,如果不采用多态性,则需要在每个类中增加一个判断值,这样如果多态的成员有很多个,那么就回到了面向对象设计了。而多态的实现是在重载函数前加virtual,在基类中声明virtual该虚函数的性质自动地向下带给其子类,所以在其子类的虚函数定义中可以省略virtual.编译通常是在先期联编的模式下工作的,只有看见虚函数,才把它作为滞后联编来实现。但是如果虚函数在基类与子类中出现的仅仅是明子相同,而参数类型不同,或返回类型不同的话即使写上了virtual关键字,则也不进行滞后联编。书上关于虚函数的设定是这样写的:一个类中,将所有的成员函数都尽可能地设置为虚函数总是有益的。它除了会增加一些开销,没有其他的坏处,需要注意的是:
1.只有类成员才能设置虚函数,因为虚函数只能适合于有继承关系的类对象。
2.静态函数由于不限于某个对象,不存在多态关系,他只是调用。
3.内联函数不能是虚函数,因为内联函数事先已经确定好代码,不能动态确定。
4.构造函数不能是虚函数,因为构造时,对象还是一片未知空间,构造后才能成为一个名副其实的事例
5.析构函数可以使虚函数,例如基类和子类都申请了堆空间,当利用函数传递过来一个对象指针,在析构时指针是指向基类?还是子类?将析构函数设定为虚函数,便解决这个问题
 
       啊,好累现在时刻12:56:19,看了2个多小时的书,边看边写下自己的思维过程与体会,很有成就感,希望有看到这片劣文的朋友和我一起讨论,派生构造类这块骨头我留到明天再啃。肚子好饿,吃饭去!