首页 > 编程语言 >C++ 多态

C++ 多态

时间:2024-07-28 20:28:47浏览次数:13  
标签:函数 子类 多态 virtual 地址 C++ 父类

多态

基本概念

多态是C++面向对象三大特性之一

  • 多态分为两类
    • 静态多态:函数重载和运算符重载属于静态多态,复用函数名
    • 动态多态:派生类和虚函数实现运行时多态
    • 静态多态和动态多态区别:
      • 静态多态的函数地址早绑定——编译阶段确定函数地址
      • 动态多态的函数地址晚绑定——运行阶段确定函数地址

 

  • 动态多态满足条件
    • 有继承关系
    • 子类重写父类的虚函数(使用virtual修饰)
      • 重写:函数返回值类型 函数名 参数列表完全一致 称为重写
  • 动态多态的使用——父类的指针或者引用 执行子类对象
#include "iostream"
using namespace std;

class Animal {
public:
    // 虚函数
    virtual void speak() {
        cout << "动物在说话" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() {
        cout << "小猫在说话~" << endl;
    }
};

void doSpeak(Animal &animal) {
    animal.speak();
}

void test02() {
    Cat cat;
    doSpeak(cat);
}

int main() {
    cout << "hello!" << endl;
    test02();
}

动态多态原理

上述代码中,Animal类看起来是一个空类,如果不带virtual关键字,应占1字节,但其实际上占了4字节,其内部是一个vfptr(virtual function pointer 虚函数(表)指针),它指向vftable虚函数表,表内记录了虚函数的地址。

当子类重写父类的虚函数,子类中的虚函数表内部原本父类的虚函数地址会替换成子类的虚函数地址。

当父类的指针或者引用指向子类对象的时候,发生多态

Animal & animal = cat;

animal.speak();

发生多态,调用Cat的speak()函数。

标签:函数,子类,多态,virtual,地址,C++,父类
From: https://www.cnblogs.com/1873cy/p/18328750

相关文章

  • 全网最全最新100道C++面试题:20-40
    前述:本文初衷是为了总结本人在各大平台看到的C++面经,我会在本文持续更新我所遇到的一些C++面试问题,如有错误请一定指正我。新建立了一个收集问答的仓库,欢迎各位小伙伴来更新鸭interview_experience:本仓库初衷是想为大家提供一个便利,全面,准确的面试题学习场地,大家都可以对仓库......
  • C++题解(17) 狐猬编程: 640.线段覆盖
    题目描述在一条数轴上,有N条线段,第i条线段的左端点是s[i],右端点是e[i]。如果线段有重叠(即使是端点重叠也算是重叠),则输出“impossible”,如果没有重叠则输出“possible”。输入格式输入文件名:640.in多组测试数据。第一行,一个整数G,表示有G组测试数据。1<=G<=10。每组......
  • Win11系统下Yolov8的C++编译环境实践
    Date:2024年1月24日概要说明yolo简介及背景    yolo(YouOnlyLookOnce)是目前一种普及性较高的人工智能目标检测方法,它将目标检测任务重新定义为单一的回归问题,从而实现了从图像像素到边界框坐标和类别概率的直接映射。在业界,Yolo的新应用层出不穷,其需求多样变化、源......
  • C++ 数据结构体解析
    文章目录1.定义结构体2. 访问结构成员3. 结构作为函数参数4. 指向结构的指针5. typedef关键字1.定义结构体C/C++数组允许定义可存储相同类型数据项的变量,但是结构是C++中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。结构用于表示一条记......
  • C++和R穿刺针吸活检肿瘤算法模型模拟和进化动力学量化差异模型
    ......
  • C++自学笔记29(多维数组)
    我们在之前的笔记中知道数组解决了重复变量的赋值问题,也知道数组就是指针可以用指针的方式修改内容。现在有一个数组对50个变量赋值a[50],我们有50个这样的数组a[50][50],对于这样的数组我们还有50个a[50][50][50]。这就是一维数组、二维数组、三维数组......我们拿堆上建立......
  • C++自学笔记30(类型双关)
    上栗子#include<iostream>intmian(){inta=50;doublever=a;std::cout<<ver<<std::endl;std::cin.get();}a是一个占据4字节的数据,将a复制给ver并转换为double8个字节。这其中就是隐式的类型转换。第一个是int类型的50,第二个是类型转换后的......
  • 【C++】实验五
    题目:1、五角数被定义为n(3n-1)/2,n=1,2,……,以此类推。因此最初的几个五角数为1,5,12,22,……,请使用下面的函数头编写函数,返回五角数:intgetPentagonaNumber(intn)编写程序,使用这个程序展示前20个五角数,每行打印5个。思路:首先需要编写一个返回五角数的函数,输出20个数需要在主函数......
  • C++中 cin、cin.get()、cin.getline()、getline() 的区别
    cin我们先介绍c++中最常用的输入流对象cin我们常用 cin>>num 来从缓冲区中读取数据到 num 中,num 的变量类型可以是多种类型,最常用的有 int、string、char、double、float等等voidcin_test(){std::cout<<"-----------cintest---------"<<std::endl;st......
  • 【C++软件调试技术】使用 Windbg 分析软件异常时的诸多细节与技巧总结
    目录1、dump文件1.1、dump文件的生成方式1.2、dump文件的大小2、pdb符号文件2.1、pdb文件的路径设置2.2、pdb文件的时间戳与名称问题2.3、如何确定要找哪些pdb文件?3、使用Windbg静态分析dump文件以及动态调试程序的一般步骤4、确定发生异常或崩溃的业务模块,到业务模块......