(个人笔记,看不懂莫怪)
一
多态 在程序运行的过程中才能决定调用什么方法,声明基类的指针,利用该指针指向任意一个子类的对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
类中的多态就是派生类对同基类的方法进行了重写,然后程序根据上下文信息来决定使用哪个方法。
在基类base 和派生类 first中,如果在first类中对基类的一个函数input()进行了重写,
如果出现
first one
base *P = &one;
P->input()
这种情况的时候,那么指针P指向的函数是基类base的input()函数;
那当我们希望使用的派生类的函数是,我们就在基类的input()函数前加上关键字 virtual
如果使用了virtual ,则程序根据引用或者指针指向的对象的类型来选择方法,否则的话程序会根据引用或者指针的类型来选择方法。
编译器会为有虚函数的类维护一个虚函数表,这个虚函数表是一个一维数组,里面存这每个虚函数的内存地址。
同时当对象调用构造函数时会自动生成一个虚表指针,虚表指针指向虚函数表,当调用虚函数时有虚表指针找到虚函数的地址然后调用。P->vp->input()
二
first one
base *P = &one;//将派生类引用或者指针转换成基类引用或者指针被成为向上强制转换,这个是允许的。
(这样就可以使用一个数组来表示多种类型的对象了 base *Arr[10])
反过来
base one;
first *P = &one.://这是向下强制转换,如果不适用显示类型转换,则这种方式是不允许的。显示类型转换:first *P = (base *)&one
三
基类的析构函数要定义城虚函数,否则当使用new/delete来为派生类的对象动态分配空间的时候,当对象被回收时,调用的就是基类的析构函数了,这显然会造成内存泄露的问题。
四
virtual void fun()=0 这个是纯虚函数
抽象类:至少有一个纯虚函数,而且派生类必须要实现纯虚函数。否则派生类就变成了抽象类了。
抽象类不能创建该类的对象。