polymorphic--多态

多态是什么

多态,顾名思义,多种形态。指的是不同的人做相同的事会产生不同的结果。在程序上的表现就是,不同的对象调用同一个函数会呈现不同的结果。多态是建立在继承的基础上的

图示:

运行结果:

形成多态的条件

我们的多态要达成这样的效果——当指针或引用指向父类对象时,则调用父类的虚函数,指向子类对象时则调用子类对象的虚函数表

1.要用基类指针/引用调用虚函数

能不能是子类指针或者引用?

不行,因为子类具有基类没有的成员。如果让子类指向父类(子类指针指向父类对象),那么编译就会报错

图示

这也能解释为什么要使用父类指针或引用调用虚函数,因为父类能够指向子类(子类当中有父类的那部分)

总结一下:”容量小的“可以指向”容量大的“,”容量大的“不可以指向”容量小的“

为什么不能是基类对象?

注:关于虚函数表后文会说明

因为对象间的切片(赋值),不会拷贝虚函数表,(以上图为例。倘若拷贝了虚函数表,就意味着无论是子类对象还是父类对象调用,调的都是子类的虚函数。很显然这不符合多态的要求)

2.被调用的函数必须是虚函数,且派生类的虚函数要重写基类的虚函数

1)什么是虚函数?

函数前用virtual修饰的就是虚函数

2)虚函数重写/覆盖的条件?

a.三同,函数名相同,返回值相同,参数类型相同

b.三个例外

b.1虚函数的返回类型可以是构成父子关系的指针或引用(必须同时是指针或同时是引用)

b.2派生类的虚函数可以省略virtual

多态原理

每个类对象都有一个虚函数指针(二级指针),这个虚函数指针存储指向了一张虚函数表的地址,

子类会继承父类的虚函数表,倘若子类对虚函数进行了重写,则改写虚函数表表上的内容

图示:

因此当父类指针/引用指向父类对象时则调用父类的虚函数(父类指针\引用会获得该对象的虚函数表),反之则调用子类对象的虚函数

图示

析构函数要不要是虚函数

要重写,为什么?(注:析构函数会被编译器处理为destructor)

倘若不重写析构函数,图示

运行结果

没有调用Child的析构函数 可能会导致内存泄露

因为按照多态原理,父类指针会去子类的虚函数表寻找析构函数,由于析构函数不是虚函数,所以找不到,因此不会调用子类的析构函数。

注意:

Child空间是被delete bptr释放的吗?是的

程序结束时只会自动调用类对象的析构函数?是的 不会调用new出来的类的析构函数

构造函数要写成虚函数吗

不能,因为虚函数存在于虚函数表,虚表指针指向虚函数表,虚表指针是在构造函数初始化才生成的

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值