zoukankan      html  css  js  c++  java
  • C++学习笔记45:多态性

    运算符重载

    运算符是针对新类型数据的实际需要,对原有运算符进行适当的改造

    1.比如使复数类的对象可以使用+运算符实现加法;

    2.比如使时钟类的对象可以用++运算符实现时间增加1秒;

    注意:可以重载为类的非静态成员函数、非成员函数

    重载为类成员的运算符函数定义形式:
    函数类型 operator 运算符(形参)

    {

      ...

    }

    //参数个数=原操作数个数减1,(后置++,--除外)

    如何重载运算符为非成员函数?

    有些运算符不能重载为成员函数,例如二元运算符的左操作数不是对象,或者不能由我们重载运算符的对象;

    备注:如果在重载运算符函数中要操作某类对象的私有成员,可以将此函数声明为该类的友元;

    后置单目运算符的重载函数,形参列表中要增加一个int,但不必写形参名:
    例如:

    表达式 oprd B

    等同于operator B(oprd,0)

    虚函数:

    通过虚函数实现运行时多态性,实现动态绑定;

    虚函数必须是非静态的成员函数(属于对象的,而不是类的),虚函数经过派生后就可以实现运行过程中的多态;

    注释:

    一般的成员函数可以是虚函数;

    构造函数不能是虚函数;

    析构函数可以是虚函数;

    虚函数一般不声明为内联函数,因为内联函数的处理是静态的;

    虚析构函数

    可能通过基类指针删除派生类的对象;如果需要通过基类指针调用对象的析构函数,就需要让基类的析构函数成为虚函数;

    虚表与动态绑定

    虚表

    每个多态类都有一个虚表(virtual table)

    虚表中有当前类的各个虚函数的入口地址

    每个对象有一个指向当前类的虚表的指针(虚指针vptr)

    动态绑定的实现

    构造函数中为对象的虚指针赋值

    通过多态类型的指针或者引用调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址;

    通过该入口地址调用虚函数;

    抽象类

    纯虚函数的定义格式:
    virtual 函数类型 函数名(参数表) = 0;

    带有纯虚函数的类称为抽象类;

    抽象类的作用:
    抽象类为抽象和设计的目的而声明;

    将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为;

    对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现;

    C++11:override 与final

    override

    • 多态行为的基础:基类声明虚函数,继承类声明一个函数覆盖该虚函数
    • 覆盖要求: 函数签名(signatture)完全一致
    • 函数签名包括:函数名 参数列表 const

    C++11引入显示函数覆盖,在编译期而非运行期捕获此类错误;在虚函数显示重载中运用,编译器会检查基类是否存在一虚函数,与派生类中带有声明override的虚函数,有相同的签名,若不存在则会报错;

    final

    C++11中提供的final,用来避免类被继承,或是基类的函数被改写;

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    NS2网络模拟(2)-丢包率
    NS2网络模拟(3)-吞吐率
    NS2网络模拟(4)-吞吐率图
    NS2网络模拟(5)-homework01.tcl
    nagios
    Javascript 统计复选框选中个数
    JUnit单元测试实践:测试工具类和方法(EmptyUtils)
    2013年工作中遇到的20个问题(Bug):161-180
    2013年工作中遇到的20个问题(Bug):161-180
    数据持久层(DAO)通用API的实现
  • 原文地址:https://www.cnblogs.com/hujianglang/p/6539668.html
Copyright © 2011-2022 走看看