C++基础4:多态

1.多态概念:

多态:不同类型对象调用相同接口完成不同的行为。
根据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式。

2.早绑定与晚绑定

实现:C++多态性主要是通过虚函数实现的,虚函数允许子类重写override(注意和overload的区别,overload是重载,是允许同名函数的表现,这些函数参数列表/类型不同)。
多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。
如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。
而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。

覆盖(重写)成立的三个条件
1.继承
2.子类覆盖(重写)父类虚函数
3.父类指针/引用指向子类

3.虚函数定义的规则

虚函数定义规则:
  1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,有无const.那么即使加上了virtual关键字,也是不会覆盖。
  2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。
  3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。
  4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义,但是在编译的时候系统仍然将它看做是非内联的。
  5.构造函数不能是虚函数,因为构造的时候,对象还是一片未定型的空间,只有构造完成后,对象才是具体类的实例。
  6.析构函数可以是虚函数,而且通常声明为虚函数。

#include<iostream>
using namespace std;

class Base{
public:
    virtual void test(){
        cout<< "Base test" <<endl;
    }
};

class Derive:public Base{
public:
    void test(){
        cout << "Derive" << endl;
    }
};
int main(){
    Base* pbase=new Derive;
    pbase->test();

    Derive yderive;
    Base& ybase= yderive;
    ybase.test();
}

4.纯虚函数

class 类名{
    virtual 返回值类型 函数(形参列表) = 0;
}

纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加=0

抽象类
包含纯虚函数的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。

5.重载和覆盖的区别

No重载覆盖
1重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。覆盖要求函数名、参数列表、返回值必须相同。
2在类中重载是同一个类中不同成员函数之间的关系。在类中覆盖则是子类和基类之间不同成员函数之间的关系。
3重载函数是在编译时确定调用一个函数。重载函数是在执行时确定调用个函数。

6.判断是否覆盖

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值