C++中深入理解dynamic_cast

C++中深入理解dynamic_cast转载:https://blog.csdn.net/gaojing303504/article/details/78860773dynamic_cast运算符的主要用途:将基类的指针或引用安全地转换成

大家好,又见面了,我是你们的朋友全栈君。

转载:https://blog.csdn.net/gaojing303504/article/details/78860773

dynamic_cast运算符的主要用途:将基类的指针或引用安全地转换成派生类的指针或引用,

并用派生类的指针或引用调用非虚函数。如果是基类指针或引用调用的是虚函数无需转换就能在运行时调用派生类的虚函数。

前提条件:当我们将dynamic_cast用于某种类型的指针或引用时,只有该类型至少含有虚函数时(最简单是基类析构函数为虚函数),才能进行这种转换。否则,编译器会报错。

 

用个例子来说明:

1.基类中没有虚函数:

#ifndef _CLASS_H_
#define _CLASS_H_

class Base
{
public:
    Base();
    ~Base();
    void print();
};


class Inherit :public Base
{
public:
    Inherit();
    ~Inherit();

    void show();
};

#endif

 

#include "Class.h"
#include <iostream>
Base::Base()
{

}

Base::~Base()
{

}

void Base::print()
{
    std::cout << "Base funtion" << std::endl;
}

Inherit::Inherit()
{

}

Inherit::~Inherit()
{

}

void Inherit::show()
{
    std::cout << "Inherit funtion" << std::endl;
}
#include "Class.h"

int main()
{
    Base* pbase = new Inherit();

    Inherit* pInherit = dynamic_cast<Inherit*>(pbase);

    return 0;
}

编译器报错:

<span role="heading" aria-level="2">C++中深入理解dynamic_cast

 

 

我们改基类

class Base
{
public:
    Base();
    virtual ~Base();
    void print();
};
#include "Class.h"

int main()
{
    Base* pbase = new Inherit();

    Inherit* pInherit = dynamic_cast<Inherit*>(pbase);

    pInherit->show();//这样动态转换,我们就可以调用派生类的函数了

    return 0;
}

<span role="heading" aria-level="2">C++中深入理解dynamic_cast

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154986.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Qt浅谈之七:抽奖软件(可显示图片和姓名)

    Qt浅谈之七:抽奖软件(可显示图片和姓名)使用Qt设计的一个抽奖软件,可以显示抽奖人员姓名和图片(无图片时只显示姓名),在Windows下和Linux下都能打包运行。可以设置图片滚动的频率。

    2022年10月21日
    2
  • CentOS7 中使用 firewall-cmd 配置只允许指定ip访问本机的指定端口

    CentOS7 中使用 firewall-cmd 配置只允许指定ip访问本机的指定端口

    2021年5月31日
    345
  • 树莓派python编程入门与实战_树莓派python软件

    树莓派python编程入门与实战_树莓派python软件一、远程连接和远程桌面设置:终端下执行命令:ifconfig,查看树莓派的IP终端下执行命令:sudoapt-getinstallxrdp,安装远程桌面支持。在windows电脑上点开始,输入mstsc,出来远程桌面界面,输入树莓派IP,用户名:pi密码raspberry,就可以连上了。二、关闭树莓派正确操作:方式一:终端下执行命令:sudopoweroff…

    2022年10月15日
    6
  • failed to load response data:Request content was evicted from inspector cache

    failed to load response data:Request content was evicted from inspector cache在项目中,我用谷歌浏览器查看后台返回的json数据,但是发现前端页面已经接收成功,并且渲染了对应json数据了,但是network里面的response却报错:调整对应json数据后发现,当后台返回前端的数据超过了一定大小时,就会出现响应截断的问题,不过目前没有找到在哪里设置,我本地是大概超过10m就会截断。谷歌浏览器编辑设置是about:flags,但是我找不到对应设置response的选项。后来发现火狐浏览器可以设置报文响应大小的限制,先在url栏输入about:config,然后选择接受风险并

    2022年5月13日
    89
  • SQL Server2012 安装方法详解[通俗易懂]

    首先要找到自己下载好的安装包,并且保持网络畅通。双击setup.exe。稍微等待大概一分钟时间,会出现提示(在安装过程中,会多次出现如下提示,只需要耐心等待就好了。我之后就不一一例出来了)。在我们安装SQLServer之前需要先检查下电脑配置。请点击“系统配置检查器”进行检查。出现“已通过”的提示则可以进行安装。点击确定进行安装(这里有的人的电脑在“重新启动计算机”会显示不通过。方法

    2022年4月6日
    252
  • 地理加权回归模型_arcgis栅格数据归一化0到1

    地理加权回归模型_arcgis栅格数据归一化0到1(再次接近6000字,诚意满满啊)从这一章开始进入实际操作环节……首先还是用ArcGIS,毕竟这个东西比较容易。实际上要说起来,GWR有专门的软件,叫做GWR,但是这个软件暂时我还没有用过,所以等我先学习一下,把他放到最后才说了,先用比较熟悉的,比如ArcGIS、比如R语言,这些来讲讲(还有一个我非常熟悉的软件是GEODA,可惜GEODA仅支持回归分析,不支持地理加权回归)。

    2022年10月7日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号