首页 > 编程语言 >c++ virtual || virtual =0

c++ virtual || virtual =0

时间:2024-06-21 23:58:29浏览次数:22  
标签:函数 继承 子类 基类 c++ virtual 派生类 指针

虚函数&& 纯虚

  1. 抽象类:包含纯虚函数的类称为抽象类,继承层次结构的较上层。
  2. 作用:将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。
  3. 继承:子类继承基类的成员及成员函数,不可以删除,可以(修改)通过虚函数重写基类的方法,可以(增加)新增对于子类的新方法,其中对于子类的子类也会继承基类
  4. 继承作用:减少重复代码,调用子类方法,灵活性,解耦
  5. 抽象类注意:纯虚函数的定义由派生类给出,如果只是继承基类的纯虚函数,没有定义,那么派生类仍然还是一个抽象类,抽象类是不能定义对象的。否则给出定义,成为建立对象的具体的类。
  6. 虚函数:可以让子类重写(也叫覆盖),在派生类中重新定义的成员函数。
  7. 调用子类的函数:参考
    1. 创建基类类型指针,通过将指针指向基类或某个派生类对象,调用派生类的函数。
    2. A *a = new B(); || B b(); A* a = & b;如果派生类中没有虚函数实现,调用基类的实现
  8. 区分继承中普通函数&&virtual的函数调用(决定调用的是基类还是派生类中的函数):
    1. 普通函数:根据指针或引用的类型,
    2. 声明为virtual的函数:其调用的对象的基本类型(指针指向的地址对于的对象)
  9. virtual关键字在派生类中不是必须的,因为重写始终是虚拟的。
  10. override:如果派生类与基类虚函数的签名不一致,编译器就会报错。

  11. final:如果不希望某个类被继承,或不希望某个虚函数被重写,则可以在类名和虚函数后加上 final 关键字,再被继承或重写,编译器就会报错。

  12. C++多态性:同一个函数名或操作符在不同的对象上具有不同的行为。
  13. 纯虚函数:基类中没有定义,编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。

  14. 作用:当不想为基类创建对象时
  15. 注意:继承类中重新声明函数
  16. vptr(虚指针)和vtbl(虚表):

    1. vtbl(虚表)中:在类的继承中,每一个class产生所有虚函数指针

    2. vptr(虚指针):每一个类添加一个指针,指向虚表,因为指针存在,又会占用内存,

    3. 因为继承的原因,子类中虚表还有内存中的数据都会增加,包含基类的虚函数和数据

    4. 如何获取到类对象的虚函数表地址:(int*)&a,虚函数表第1个函数地址(int*)*(int*)(&a)虚函数表第2个函数地址(int*)*(int*)(&a) + 1

    5. 如何调用到类对象虚函数表地址:创建函数别名typedef void(*Fun)(void);名为fun的无参返回类型为void的函数指针,创建 指向函数指针类型 的指针Fun pFun = nullptr;指针指向 = (函数指针类型的)虚函数表第1个函数对象,调用函数pFun();

标签:函数,继承,子类,基类,c++,virtual,派生类,指针
From: https://blog.csdn.net/sengyongan/article/details/139872137

相关文章

  • 【C++】list的使用方法和模拟实现
    ❤️欢迎来到我的博客❤️前言list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素list与forward_list非常相似:最......
  • 2024年华为OD机试真题-分披萨-(C++/Java/python)-OD统一考试(C卷D卷)
    题目描述"吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不同奇数块,且肉眼能分辨出大小。由于两人都想吃到最多的披萨,他们商量了一个他们认为公平的分法:从"吃货"开始,轮流......
  • c/c++ 数据结构 顺序栈
    本文是以c语言的风格编写的c++程序。栈的特点:先进后出,后进先出。顺序栈的结构定义:一个数组以及一个”指针“(不是真正的指针,而是位置变化的说明)#include<stdio.h>#include<malloc.h>#defineMaxsize20typedefstruct{ intdata[Maxsize]; inttop;}SqStack; 初......
  • 2020C++等级考试二级真题题解
     202012数组指定部分逆序重放c++ #include<iostream>usingnamespacestd;intmain(){  inta[110];  intn,k;  cin>>n>>k;  for(inti=0;i<n;i++){    cin>>a[i];  }  for(inti=0;i<k/2;i++){......
  • C++系统相关操作1 - 调用命令行并获取返回值
    1.关键词2.sysutil.h3.sysutil.cpp3.1.system_util_unix.cpp3.2.system_util_win.cpp4.测试代码5.运行结果6.源码地址1.关键词关键词:C++系统调用systempopen跨平台应用场景:希望直接调用操作系统的某些命令,并获取命令的返回值。2.sysutil.h#pragm......
  • C++系统相关操作2 - 获取系统环境变量
    1.关键词2.sysutil.h3.sysutil.cpp4.测试代码5.运行结果6.源码地址1.关键词C++系统调用环境变量getenv跨平台2.sysutil.h#pragmaonce#include<cstdint>#include<string>namespacecutl{/***@briefGetanenvironmentvariable.......
  • C++核心编程运算符的重载
    C++核心编程运算符的重载文章目录C++核心编程运算符的重载1.“+”运算符的重载1.1作为成员函数重载1.2作为全局函数重载2."<<"运算符重载2.1为什么需要重载左移运算符2.2如何重载左移运算符2.3注意事项3."++"运算符重载3.1前置递增运算符重载3.2后置递增运算符重载......
  • 2022年大作业参考报告-使用C++语言开发小学生成绩管理系统、中学生成绩管理系统、大学
    背景:目录第一章需求分析   21.1   问题描述   26.1   功能需求   26.2   开发环境   26.3   开发过程   2第二章概要设计   32.1   总体设计   32.2   类的定义   32.3   接口设计   52.4  ......
  • opencv入门-小白的学习笔记c++(1)
    注:以下是根据链接https://blog.csdn.net/Cream_Cicilian/article/details/105427752的小白学习过程。1加载、修改、保存图像1.1加载图像1.1.1加载图像cv::imread用于从文件中读取图像数据并将其存储到一个cv::Mat对象中,其中第一个参数表示图像文件名称第二个参数,表......
  • 0基础学C++ | 第03天 | 基础知识 |算术运算符 | 赋值运算符 | 比较运算符 | 逻辑运算
    前言前面已经讲了,数据类型以及求数据类型所占的空间0基础学C++|第02天|基础知识|sizeof关键字|浮点型|字符型|转义字符|字符串|布尔类型|数据的输入-CSDN博客,现在讲运算符算术运算符 作用:用于处理四则运算#include<iostream>usingnamespacestd;in......