ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++_19_纯虚函数和抽象类

2022-01-07 21:03:24  阅读:134  来源: 互联网

标签:函数 19 成员 派生类 多态 纯虚 基类 抽象类


虚(成员)函数:

    在C++中,只有类中的成员函数能被声明为虚函数,顶层函数则不能被声明为虚函数;并且如果在类内声明类外定义,则只在类内声明时加virtual
    声明虚函数是为了构成多态,多态需要继承关系,需要在类中声明;
    虚函数能被继承:基类被声明为虚函数,那么派生类即便未添加virtual关键字声明,派生类也会自动被定义为虚函数。(虚函数可以被继承)

 

虚成员函数表vtable

    C++通过虚成员函数表vtable实现多态,虚函数表中存储的是类中虚函数的入口地址    
    普通类中是没有虚函数表的,只有在具有虚函数的类中(无论是自身添加的虚函数还是继承过来的虚函数)才会具有虚函数表。

 

 

虚析构函数

    构造函数不能被声明为虚函数,因为执行构造函数前对象尚未完成创建
    析构函数可以被声明为虚函数
    通常来说,如果派生类中存在一个指向动态分配内存的成员变量,并且派生类的析构函数中定义了释放该动态分配内存的代码,则应该将基类的析构函数声明为虚函数。

 

 

静态成员函数

    只有非静态成员函数才可以成为虚函数,而静态成员函数不能声明为虚函数。

 

 

重载、覆盖和遮蔽

    函数名相同无非就几种情况:多态、重载和遮蔽
    多态必须是虚函数,重载和遮蔽也介绍一下

    1、重载:
          
函数重载是编译期绑定,它并不是多态
          同名函数不同参数不同用处

    2、覆盖:
        
  函数覆盖属于运行期绑定,但是要注意:如果函数不是虚函数,则无论采用什么方法调用函数均为编译期绑定。
          覆盖构成条件和多态构成条件是相同的
          覆盖是一种函数间的表现关系,而多态描述的是函数的一种性质,二者所描述的其实是同一种语法现象。
          具备三个条件后,派生类中的虚成员函数会覆盖基类中相同签名的虚成员函数,通过基类指针或引用来调用虚成员函数,则会形成多态。

    3、遮蔽:

          函数遮蔽同样要求构成继承关系,构成继承关系的两个类中具有相同函数名的函数,如果这两个函数不够成覆盖关系,则就构成了遮蔽关系。
            遮蔽理解起来很简单,只要派生类与基类中具有相同函数名(注意不是相同函数签名,只需要相同函数名就可以了)并且不构成覆盖关系即为遮蔽。
          遮蔽可以分为两种情况,一种是非虚函数之间,另一种则是虚函数之间。

 

 

抽象基类和纯虚成员函数

    纯虚成员函数的声明语法如下:
          virtual 函数返回类型 函数名 (函数参数) = 0;
    
纯虚成员函数没有函数体,只有函数声明,在纯虚函数声明结尾加上“=0”表明此函数为纯虚成员函数。包含纯虚成员函数的类即为抽象基类,之所以说它抽象,那是因为它无法实例化,也即无法用于创建对象。纯虚成员函数可以被派生类继承,如果派生类不重新定义抽象基类中的所有(有多个则要重新定义多个)纯虚成员函数,则派生类同样会成为抽象基类,也不能用于创建对象。

 

 

操作符

    dynamic_cast操作符
    typeid操作符

 

 

标签:函数,19,成员,派生类,多态,纯虚,基类,抽象类
来源: https://www.cnblogs.com/zlxxc/p/15776768.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有