首页 > 编程语言 >C++_19_虚函数、纯虚函数和抽象类 - 重写版

C++_19_虚函数、纯虚函数和抽象类 - 重写版

时间:2023-11-05 23:23:59浏览次数:36  
标签:函数 19 成员 派生类 多态 C++ 纯虚 基类

虚(成员)函数:

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

 

虚成员函数表vtable

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

 

 

虚析构函数

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

 

 

静态成员函数

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

 

 

重载、覆盖和遮蔽

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

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

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

    3、遮蔽:

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

 

 

抽象基类和纯虚成员函数

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

 

 

操作符

    dynamic_cast操作符
    typeid操作符

 

 

标签:函数,19,成员,派生类,多态,C++,纯虚,基类
From: https://www.cnblogs.com/zlxxc/p/17811513.html

相关文章

  • C++_25_函数模板和类模板 - 重写版
    模板:在C++中允许函数重载,但函数重载每次都必须完全对上参数的顺序,类型和数量。所以C++提供了另一种代码重用机制——“模板”,可以作为同一种类型函数的统一调用接口。模板机制下可划分:1、函数模板      2、类模板模板的语......
  • C++_28_空指针、野指针、智能指针 - 重写版
     野指针:没有明确执向的指针,可能会胡乱指向任意一个变量;编程的时候绝不允许出现野指针;int*p;//错误,未初始化指向一块地址,会变成野指针如果确实需要先不指定到需要使用的内存,那就先定义一个空指针;-------》宁愿指向为空也不要为野;因为野指针你把握不住; 空指针:让指针指向N......
  • 函数剩余参数与 展开运算符
    //剩余参数functionsum(...arr){console.log(arr)}sum(3,4,5,6)//求数组最大值letarr=[1,44,7,88]console.log(Math.max(...arr))......
  • python语法糖之map函数
    一,map函数是干什么的 map()函数是Python中的一个内置函数,它接收一个函数和一个或多个可迭代对象作为输入,然后返回一个由输入可迭代对象的每个元素或子序列组成的迭代器。简单来说,map()函数用于将一个函数应用于可迭代对象的每个元素或子序列,并返回包含结果的迭代器。例如,如果......
  • C++_02_命名空间和作用域运算符 - 重写版
    命名空间在C++中命名空间(namespace)的作用:命名空间,就是为了解决同一个源代码中相同命名的变量或者函数之间相互冲突的问题,就是要避免这种冲突,让程序代码中可以多次使用同一个标识符而存在的。对于一名开发者而言,代码量过于庞大,或多或少会忘记之间之前用过的变量名或函......
  • 2023-2024-1 20231319 《计算机基础与程序设计》第六周学习总结
    2023-2024-120231319邓传山《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/12999)这个作业要求在哪里[作业要求](https://www.cnblo......
  • C++_01_初步认识C++语言 - 重写版
    一、认识“C++语言”一、首先聊聊什么是语言?语言是一套具有“语法”、“词法”规律的系统,是思维的工具。计算程序设计语言是计算机可以识别的语言,用于描述解决问题的方法,供计算机阅读和执行。语言由低级到高级依次分为4类:1、机器语言     (由......
  • SQL Server中字符串函数LEN 和 DATALENGTH比对
    LEN:返回指定字符串表达式的字符(而不是字节)数,其中不包含尾随空格。DATALENGTH:返回用于表示任何表达式的字节数。示例1:(相同,返回结果都为5): select LEN ('sssss')  select DATALENGTH('sssss')  示例2:(不相同,DATALENGTH是LEN的两倍):  select LEN(N'sssss')  sel......
  • B站C语言第11课——函数和递归
    1.工具cpulspuls.com  程序员知乎:stackoverflow.com232.递归——程序调用自身的编程技巧称为递归史上最简单的递归intmain(){ printf("hehe\n"); main(); return0;}递归常见的错误:栈溢出——例子1:#include<stdio.h>voidprintf(intn){if(n>9){print(n/10);}pr......
  • C++_28_重载、重写、重定义
    1、重载同一作用域的同名函数,重复定义;参数格式、参数顺序或者参数类型不同;函数重载和函数的返回值没有任何关系 2、重写  3、重定义......