多态

在这里插入图片描述
编译时多态:在编译期间编译器根据函数实参的类型确定要调哪个函数(这个我们之前已经接触过了,和函数重载差不多,是同名函数,但是参数不同)
运行时多态:在程序运行期间才会去判断到底会调用哪个函数。这里我们主要讲的就是动态多态。C++怎么实现多态?(动态多态,静态多态,函数多态,宏多态)动态多态通过虚函数和继承实现静态多态通过泛型来实现函数多态通过函数重载来实现宏多态通过宏替换来实现
函数的重写
被重写的那个函数一定要是虚函数(即父类中的那个函数必须是虚函数,在父类中是虚函数的情况下,子类中重写的那个函数可以不加上virtual关键字)
重写的两个函数一定是一个在父类,一个在子类,子类的虚函数对父类的虚函数进行重写

两个函数的函数名和参数列表必须相同,一模一样!多态的形成条件子类有对父类中的虚函数重写有一个父类的指针/引用来调用重写的虚函数(指向父类调父类的,指向子类调子类的)
注意:如果不构成多态,即不满足上面的两个条件,具体调用哪个函数是根据调用者的类型来确定的。一旦构成多态,具体调用哪个函数则是根据调用者的对象来确定的(因为父类的指针/引用可以指向子类的对象)
基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性(即可以不加virtual关键字,但最好加)

只有类的非静态成员函数才能定义为虚函数,静态成员函数不能定义为虚函数(静态成员不能被继承)

如果在类外定义虚函数,只能在声明函数时加virtual关键字,定义时不用加。

构造函数不能定义为虚函数,虽然可以将operator=定义为虚函数,但最好不要这么做,使用时容易混淆

不要在构造函数和析构函数中调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会出现未定义的行为。

最好将基类的析构函数声明为虚函数。(这是为了正确地释放子类对象,考虑到A* p = new B();delete p;

如果父类的析构函数不是虚函数,那么delete的时候会去调用父类的析构函数,这样就子类对象中属于子类的那部分就没有被释放(父类那部分调用父类析构函数释放了)。如果父类析构函数是虚函数,那么子类的析构函数会默认继承父类析构函数的虚函数属性,虽然两者的名字不一样,但在这里是一个特殊,在汇编里面的名字其实已经变了的,仍然构成重写。这样的话,如果父类的指针指向的是父类的对象就会调用父类的析构函数,父类的指针指向子类的对象就会调用子类的析构函数,从而构成多态),下面就是析构函数在汇编中的名字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值