c++多态特性看懂这一篇就够了

2023-05-16

什么是多态?有哪些分类?

答:多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“

有两种类型的多态性:

编译时的多态性。编译时的多态性是通过重载来实现的。

运行时的多态性。运行时的多态性是通过虚成员实现的。

构造函数为什么不能是虚函数?
1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
2,从使用角度 构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
3、构造函数不需要是虚函数,也不允许是虚函数,因为创建一个对象时我们总是要明确指定对象的类型,尽管我们可能通过实验室的基类的指针或引用去访问它。
**4、从实现上看,**vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数

析构函数为什么应该设置成虚函数?
答:假设没有设置成虚函数,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构,造成内存泄漏。

类成员函数中重载/重写(覆盖)/重定义(隐藏)的区别?
答:分别简单讲述一下函数重载,函数覆盖,函数隐藏的概念与特征:
函数重载:重载函数通常用来命名一组功能相似的函数
1.函数要在相同的类域
2.函数的名字要相同
3.函数的参数列表或返回值不同

函数覆盖:覆盖是指派生类函数覆盖基类函数
1.函数是要在不同的类域
2.两个函数的名称相同
3.基类函数必须是虚函数
4.两个函数的参数相同

函数隐藏:指派生类的函数屏蔽了与其同名的基类函数
1.两个函数在不同的类域
2.函数名称相同
3.函数参数不同
4.如果派生类函数与基类函数参数相同,但是在基类函数中没有virtual关键字,发生函数隐藏

友元可以继承吗?
不能!友元只是能访问指定类的私有和保护成员的自定义函数,不是被指定类的成员,自然不能继承。 使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3)友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

静态成员及静态成员函数能不能被继承?
基类与派生类的静态成员函数与静态成员是共用一段空间的,即静态成员和静态成员函数是可以继承的。
所以,我们可以得出以下结论:

父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问)。而且对static变量来说,派生类和父类中的static变量是共用空间的,这点在利用static变量进行引用计数的时候要特别注意。
构造函数析构函数调用顺序
1.基类对象首先被创建
2.派生类构造函数应通过成员初始化列表(调用顺序和继承顺序相关)将基类信息传递给基类构造函数 ,可以使用初始化列表句法指明要使用的基类构造函数,否则将使用默认的基类构造函数。
3.派生类构造函数应初始化派生类新增的数据成员
派生类对象析构时,程序首先调用派生类析构函数,再调用基类析构函数。

 

 

来一个多态的综合例子:

#include <iostream>
using namespace std;

class A
{
public:
        virtual void ff()
        {
                cout<<"A::ff()"<<endl;
        }
        void gg()
        {
                cout<<"A::gg()"<<endl;
        }
        void hh(int x)
        {
                cout<<"A::hh()"<<endl;
        }
};

class B :public A
{
public:
        virtual void ff()
        {
                cout<<"B::ff()"<<endl;
        }
        void gg()
        {
                cout<<"B::gg()"<<endl;
        }
        void hh(float x)
        {
                cout<<"B::hh()"<<endl;
        }
};

int main()
{
        B b;
        A* pa = &b;
        B* pb = &b;
        pa->ff(); //多态,即就是重写或者叫覆盖
        pb->ff();
        cout<<"--------------------"<<endl;

        pa->gg();
        pb->gg();
        cout<<"------------\n";
        pa->hh(3); 
        pb->A::hh(3);
        cout<<"------------\n";
        A a;
        B *pb_ = (B*)&a;
        pb_->ff();
        pb_->gg();
        return 0;
}

 

运行的结果:

 

 

 

如果看不明白结果可以看一下这个博客

https://blog.csdn.net/ypt523/article/details/79598289

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++多态特性看懂这一篇就够了 的相关文章

  • Ubuntu系统用VNCViewer连不上远程的解决办法

    有时Ubuntu重启电脑重新联网之后 xff0c 用VNCViewer远程时提示timeout 解决办法 点击Ubuntu电脑系统的设置按钮 xff0c 进入共享选项卡 检查远程登录是不是已经开启 xff0c 屏幕共享是不是活动状态 屏幕共
  • STM32串口DMA方式发送数据

    文章目录 一 DMA介绍1 概括2 DMA由来2 1程序传送方式2 2中断传送方式2 3DMA原理 3 DMA具有的功能4 DMA传输方式5 DMA主要特征6 DMA处理7 DMA工作框图8 DMA工作传送过程 二 串口DMA方式发送数据1
  • 每日一练20210629

    1 下列叙述中正确的是 2021 06 29 21 59 14 A 算法的效率只与问题的规模有关 而与数据的存储无关B 算法的时间复杂度是指执行算法所需要的计算工作量C 数据的逻辑结构与存储结构是一一对应的D 算法的时间复杂度与空间复杂度一
  • Aborted (core dumped)

    在百度谷歌了无数次之后 xff0c 看了许多关于Aborted xff08 core dumped xff09 的解决方法后 xff0c 终于找到一个解决办法 文章来自 http blog 163 com wujiaxing009 64 1
  • slam开发心得

    slam是目前比较流行 xff0c 并且是门槛较高的一个领域 xff0c 它与人工智能紧密相关 自己想就这篇博客谈谈自己在这个领域2年多来的心得 回顾这2年来自己的学习过程 xff0c 可以说是艰辛 xff0c 自己不是搞软件开发的 xff
  • STM32基于FreeRTOS的多任务程序

    STM32基于FreeRTOS的多任务程序 任务要求FreeRTOS移植介绍应用 总结 任务要求 在STM32下完成一个基于FreeRTOS的多任务程序 xff0c 执行3个周期性task task1 xff0c 每间隔500ms闪烁 xf
  • conio包含的函数及作用

    conio h是TC特有的 xff0c 用于输入输出图形方面 conio h conio h不是C标准库中的头文件 conio是Console Input Output xff08 控制台输入输出 xff09 的简写 xff0c 其中定义了
  • 有关调音台的专业英文词汇

    一 2 Track 2轨磁带 xff08 in输入 out输出 xff09 AFL 61 After fader Listen 衰减后监听 xff08 推子后监听 xff09 xff0c 这个模式下 xff0c 监听输出的信号是来自于通道电
  • 各行业的英语术语(绝对精华 2)

    实用食品用语2 b 餐具 coffee pot 咖啡壶 coffee cup 咖啡杯 paper towel 纸巾 napkin 餐巾 table cloth 桌布 tea pot 茶壶 tea set 茶具 tea tray 茶盘 cad
  • 各行业的英语术语(绝对精华3)

    b 企业缩写词 b 5S管理 ABC 作業制成本制度 Activity Based Costing ABB 實施作業制預算制度 Activity Based Budgeting ABM 作業制成本管理 Activity Base Manag
  • 各行业的英语术语(绝对精华4)--房地产

    b 房地产英语1 b 房地产英语 part 1 English for Real Estate 入世以后 xff0c 跨国房地产交易越来越多 xff0c 涉外交易动辄千百万 xff1b 地道 准确 符合国际惯例的房地产英语无疑是促成交易 避
  • ROS学习笔记6(理解ROS话题)

    文章目录 1 启动1 1 roscore1 2 turtlesim1 3 turtel teleop key 2 ROS 话题2 1 使用rqt graph2 2 使用rostopic2 3 使用rostopic echo2 4 使用ros
  • Labview 子VI 生成Library Files

    建立 Lib 文件的方法 一个简单的方法可以让你封装所有的VI到LabVIEW的llb里面 执行下面的步骤即可 LabVIEW 8 x 1 到 File Save As 将打开一个另存为对话框窗口 2 选择 将层次结构复制到新位置 3 选择
  • Python爬虫——BeautifulSoup的基本使用

    Python爬虫 BeautifulSoup的基本使用 安装beautifulsoup4模块 pip span class token function install span beautifulsoup4 1 创建BeautifulSo
  • ubuntu下安装高版本clang-format

    问题 ubuntu 16 04版本没有clang format 9以上版本源 但较低版本的工具对一些格式化配置符号不支持 使用deb文件安装高版本的话要更新的依赖太多 系统依赖 xff0c 诸如libs libstsc 43 43 等 解决
  • ST-LINK 连接图

    stm32 JTAG 管脚 ST LINK V2 JTAG 管脚 JTAG 连接模式 TVCC xff08 1 xff09 STM32 3 3V xff1b 必须连接 ST LINK根据此调整输出电平 TRST xff08 3 xff09
  • 如何给金溢RSU配路网

    如何给RSU配路网 一 路网数据采集 xff1a 利用车载单元OBU的GPS定位模块在特定的路段 xff0c 选取两个点 xff0c 一个设定为起点 xff0c 一个终点 xff08 一般大概300 400米左右 xff09 中间不能有实体
  • Linux之read命令使用

    read命令 xff1a read 命令从标准输入中读取一行 xff0c 并把输入行的每个字段的值指定给 shell 变量 1 xff09 read后面的变量var可以只有一个 xff0c 也可以有多个 xff0c 这时如果输入多个数据 x
  • shell脚本中 “set -e” 的作用

    bin bash set e command 1 command 2 exit 0 你写的每个脚本都应该在文件开头加上set e 这句语句告诉bash如果任何语句的执行结果不是true则应该退出 这样的好处是防止错误像滚雪球般变大导致一个致
  • strcpy的使用

    include lt iostream gt include lt string h gt using namespace std int main char data 61 34 dhewdwehkfew qwdhqwhdj qwhdwq

随机推荐

  • 算法复杂度时间的体现举例

    1 1 1 1 1 1 n 这个样的数列相加 xff0c 不同的算法的复杂度对比 可以学习时间怎么用 include lt iostream gt include lt cmath gt include lt ctime gt using
  • RS232 串口通信接口和代码实现红绿灯控制

    1 东西方向红灯 xff1b 2 东西方向黄灯 xff1b 3 东西方向绿灯 xff1b 4 避开发送 0x0A的底层却发送0x0D 0x0A问题 5 南北方向红灯 xff1b 6 南北方向黄灯 xff1b 7 南北方向绿灯 https b
  • apache中Options Indexes FollowSymLinks详解

    Indexes 显示一个目录下面的文件夹和文件 要禁止 Apache 显示目录结构列表 xff0c 只需将 Option 中的 Indexes 去掉即可 在Options Indexes FollowSymLinks在Indexes前面加上
  • 卸载 vmware-tools.pl和安装 vmware-tools.pl失败了,谁能解?

    v2x 64 ubuntu Desktop vmware tools distrib ls bin caf doc etc FILES INSTALL installer lib vgauth vmware install pl v2x 6
  • shell脚本$0 $1 $2 $* $@ $# 变量学习记录

    bin bash this program is use 0 and so on echo 34 THe script name is 61 61 gt 0 34 echo 34 The total parameter number is
  • c++ 11/14新特性

    C 43 43 11 新增特性 1 自动类型推导 61 61 61 61 gt auto int main1 auto a 61 10 a 是 int 类型 auto d 61 1 2 d 是 double 类型 auto f 61 2 3
  • 数据结构常见问题和概念

    1 数组和链表的区别 从逻辑结构上来看 xff0c 数组必须实现定于固定的长度 xff0c 不能适应数据动态增减的情况 xff0c 即数组的大小一旦定义就不能改变 当数据增加是 xff0c 可能超过原先定义的元素的个数 xff1b 当数据减
  • 常量指针与指针常量,函数指针与指针函数

    1 常量指针 xff1a 本质是一个指针 xff0c 表示一个指向常量的指针 const int p 能够改变指针的指向 xff0c 但不能改变指针所指对象的值 int a 61 0 b 61 1 const int p 61 amp a
  • GDB调试入门----编程珠玑

    GDB是GUN发布的一款功能强大的程序调试工具 GDB主要完成下面三个方面的功能 xff1a 1 启动被调试程序 2 让被调试程序在指定的位置停住 3 当程序被停住时 xff0c 可以检查程序状态 xff08 变量值等 xff09 总览 本
  • AMD面试小结

    关于git如何使用 关于GDB调试如何使用 关于多线程编程 关于用户态和内核态 xff1f 关于openGL 关于voiltale你用过没 xff1f volatile表示对象的值可能在程序的控制或检测之外被改变 xff0c 并告诉编译器不
  • UClode 互联网公司面试

    面试的岗位是sql内核开发 1 写一个1 2 3 4 5数字做全排列的输出程序 思想是如果只有两个数字那么只有两种排列1 2和2 1 先固定一个数 xff0c 后面就是4个数做全排列 xff0c 要是把4个数的第一个数固定 xff0c 就是
  • 刷题c++ 思考

    1 有一个vector数组 xff0c 要从中去掉一个数 xff0c 使的这个数组中的数的连乘积最大 xff0c 返回这个数的下标 xff08 数组中可能有正数 xff0c 负数 xff0c 0 xff09 int getMax xff08
  • ubuntu 20.04环境下ROS+PX4+RPG ROS DVS+DV-gui 安装

    ROS安装 使用鱼香ros的一键安装指令 xff1a wget http fishros com install O fishros amp amp fishros 分别选择 xff1a 1 会同时完成换源和安装 3 作用如图所示 4 如上
  • 数据结构 二叉树的建立与遍历

    https blog csdn net qq 37043100 article details 80171535
  • 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

    题目描述 输入两个单调递增的链表 xff0c 输出两个链表合成后的链表 xff0c 当然我们需要合成后的链表满足单调不减规则 struct ListNode int val struct ListNode next ListNode int
  • 输入一个链表,输出该链表中倒数第k个结点。

    输入一个链表 xff0c 输出该链表中倒数第k个结点 思路1 xff1a 一次循环得到节点的个数 xff0c 然后使用节点的个数减去倒数的k xff0c 就得到了正数的第count k个 xff0c 返回这个节点就可以了 struct Li
  • 爱德万题目

    shared ptr指针的循环引用问题 weak ptr 指针的使用 xff1f lockgurad的使用 单例模式的线程安全问题 try块中 xff0c 内存分配时出错了怎么办 一个数组 int arr 61 1 2 5 3 4 8 9
  • 爱德万题

    智能指针的用法 xff0c shared ptr循环引用的问题 xff0c 举例说明 写一个模板类 xff0c 它的构造函数和析构函数为什么必须是public的 xff1f int arr 61 1 2 8 4 6 2 6 7 5 6 1
  • 设计模式 开闭原则:对扩展开发,对修改关闭,增加功能是通过增加代码实现,而不是去修改源代码

    开闭原则 xff1a 对扩展开发 xff0c 对修改关闭 增加功能是通过增加代码实现 xff0c 而不是去修改源代码 class Caculaor public Caculaor int a int b string operator th
  • c++多态特性看懂这一篇就够了

    什么是多态 xff1f 有哪些分类 xff1f 答 xff1a 多态是面向对象的重要特性之一 xff0c 它是一种行为的封装 xff0c 是同一种事物所表现出的多种形态 xff0c 简单地说是 一个接口多种实现 有两种类型的多态性 xff1