多态性

简介: 多态性

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的是哪个类的对象)决定绑定哪个函数,而是在编译时候就能确定的

相关文章
|
6月前
|
Java
多态性
多态性
31 1
|
6月前
|
C++
c++多态
c++多态
52 0
|
5月前
|
C++
C++:多态性
C++:多态性
30 2
|
6月前
|
存储 C++
C++中的多态性
C++中的多态性
62 2
|
6月前
|
编译器 C++
C++程序中的多态性
C++程序中的多态性
22 0
|
6月前
|
存储 编译器 C++
C++类和对象的多态性
C++类和对象的多态性
19 0
C++类和对象的多态性
|
6月前
深入理解多态
深入理解多态
|
C++
多态(C++)下
多态(C++)
78 0
|
6月前
|
C++
54多态性
54多态性
27 0
|
6月前
|
存储 编译器 C++
C++【多态】
C++【多态】
65 0