C++父子类间的冲突(3)-- 多态

C++中的多态

C++三大特性之一就是“多态”,“多态”咋一听很高大上,其实是很容易理解的。我们先直白地理解:多态就是一个事物有很多种状态,带入到C++中,结合之前对于重写和重载的理解,我们是不是有理由怀疑函数重载就是C++中的一种多态?

  • 这种理解显然是对的!函数重载可以理解为一种静态的多态,在编译的时候根据函数参数不同调用不同的同名函数。
  • 上一节中我介绍了父类子类间的赋值兼容原则,在第二个实验中我想要根据运行时传入的不同对象参数来决定运行不同地对象中地函数,但是实验最终失败了,最终都执行了父类中地函数。我们想要根据实际地对象类型判断如何调用重写函数:父类对象调用父类中定义地函数;子类对象调用子类中定义地函数。这就是我要介绍地C++中的第二种多态,“动态多态”:引入virtual 关键字来支持多态:
  • 被virtual 声明地函数,被重写后,具有多态性。
  • 被virtual 声明地函数,叫做虚函数
    下面看一段代码,这段代码是对上一篇中实验二进行微调,仅仅在父类中地print()函数前加了virtual 声明:
#include "stdio.h"
class Parent 
{
public:
 virtual void print()//*********virtual ******/
 {
  printf("I'm Parent  \n");
 }
};
class Child : public Parent
{
public:
 void print()
 {
  printf("I'm Child  \n");
 }
};
void judge_which_exec(Parent *p)//父类对象指针作为函数参数
{
 p->print();
}
int main(int argc , char *argv[])
{
 Child c;//定义一个子类对象
 Parent p;//定义一个父类对象
 judge_which_exec(&p);//我们想要执行父类对象中的打印
 judge_which_exec(&c);//我们想要执行子类对象中的打印
 return 0;
}

我们来看一下输出结果是不是如我们预期地产生了多态地结果?
在这里插入图片描述竟然报错了?!我们仔细看下报错提示:原来是 多态是C++特有地性质,gcc编译器不再支持,需要用g++编译器,我们重新编译一下:

在这里插入图片描述
可以看到输出果然如预期,根据运行时传入地对象参数不同,打印了不同类中地函数,这就是C++中地动态多态。我们平时所说地C++地多态特性,一般特指动态多态性。

  1. virtual 关键字时C++中支持多态地唯一方式。
  2. 被重写地虚函数可表现出多态地特性。
  3. 静态联编就是编译时就已经决定好了所有地函数地运行、调用方式。
  4. 动态联编就是运行时根据参数不同,动态决定函数地运行、调用。
  5. virtual 也是能继承地,父类中地函数声明为virtual ,在子类中重写后,即使不加virtual 关键子声明,它也是虚函数。

原创内容,禁止转载

王雄 2021.03.10 首次更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值