多态性

举报
无敌清风蓝 发表于 2023/08/31 21:58:34 2023/08/31
【摘要】 多态性

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。