1.多态性
多态性只是针对虚函数说的,非虚函数,不存在多态的说法
2.虚函数
纯虚函数是在父类中声明的虚函数,它在父类中没有函数体,只有声明,要求任何子类都要定义该虚函数自己的实现方法
含有纯虚函数的类不允许创建对象,比如Human human;是错误的,这种类叫做抽象类,他们不能用来生成对象,主要目的是为了统一管理子类(或者说建立一套供子类参照的标准或规范)
抽象类中的虚函数不写函数体,而是推迟到子类中去写
抽象类主要是用来做父类,把一些公共接口写成纯虚函数,这些纯虚函数相当于一些规范,所有继承的子类都要实现这些规范(重写这些纯虚函数)
其实压根不需要抽象类(父类),直接子类实现自己的eat接口不就好了,但是如果这样的话,怎么实现多态呢?多态的实现是:父类指针指向子类对象,如果没有父类,也就不存在多态
3.父类析构函数为虚函数
用父类指针new一个子类对象,在delete的时候系统不会调用子类的析构函数,这肯定是有问题的
Human * phuman =
解决方法就是,把父类Human的析构函数声明为虚函数即可
4.不能将“this”指针从“const XXX”转为“XXX &”
如果报不能将不能将“this”指针从“const XXX”转为“XXX &”, 出现上述错误的原因是在const成员函数中调用了非const成员函数,因此只要将所调用的函数都改成const函数
5.父类和子类的函数
先执行父类构造函数,再执行子类构造函数
父类中的private成员不受继承方式的影响,子类永远无法访问
对于父类来说,尤其是父类的成员函数,如果不想让外面访问,就设置为private,如果想让自己的子类能够访问,就设置为protected,入股偶像公开,就设置为public
6.函数遮蔽
函数遮蔽:正常情况下,父类的成员函数只要是用public或者protected修饰的,子类只要不采用private继承方式来继承父类,那么子类中都可以调用,但是在类继承中,只要子类的函数和父类的函数有同名,那无论参数和类型,子类的这个函数都会遮蔽掉父类的同名函数,完全无法调用父类的同名函数了
当然也有方法可以调用父类的,只不过类是这样: 父类::成员函数名(—)的方式来调用
也可以让using的方式,比如在子类的.h种这样写 using 父类::函数,换句话说就是让父类的同名函数在子类中以重载的方式使用,这个点还比较复杂,可以看那306页
7.父类指针
父类指针new一个子类对象 是可以的,但反过来不行
比如Human * phuman2 = new Men;这是可以的
父类指针很强大, 不仅可以指向父类对象,也可以指向子类对象
但是父类指针没办法调用子类的成员函数
8.override
C++11中,可以在函数声明所在行的末尾增加一个override关键字,这个关键字是用在子类中,而且是虚函数专用的
virtual void eat() override;
如果不用父类类型指针,而是用普通对象来调用虚函数,那虚函数的作用就体现不出来了,因为这就不需要运行时(根据new的是哪个类的对象)决定绑定哪个函数,而是在编译时候就能确定的