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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python标识符以什么开头_哪个不是python合法标识符

    python标识符以什么开头_哪个不是python合法标识符python标识符命名规范介绍发布时间:2020-05-2311:03:48来源:亿速云阅读:146作者:Leahpython的标识符是什么?怎样命名?这些问题可能是我们日常工作会见到的。通过这些问题,希望你能收获更多。下面是揭开这些问题的详细内容。简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识…

    2022年9月9日
    0
  • goland2022.01.4激活码_最新在线免费激活

    (goland2022.01.4激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html747EFQ8BIF-eyJsaWNlbnNlSW…

    2022年3月31日
    55
  • 大批量数据excel下载—本文作者只试了51万数据的下载,用时7秒

    一.背景:现在的项目里,有诸多下载功能,随着数据越来越多,下载的时间也越来越长,很影响用户体验,为了解决这一问题,我不得不挺身而出,斩破难关。项目中原本用的是poi-HSSFWorkbook,但是如果是50万数据量下载,回经历一个漫长的等待过程,然后内存溢出。jxl也不用想了,估计也差不多。二.两种方法:后来从网上搜索发现针对大数据量的导出有两条路可以走:第一:用poi-SXSSFWo

    2022年4月4日
    40
  • 《哈佛大学公开课:幸福课》学习笔记(3)「建议收藏」

    《哈佛大学公开课:幸福课》学习笔记(3)「建议收藏」关键词/句:Howcanwegetbeyondthat”comfortablynumb”?Howcanwegetbeyondthat”queitdesperation”?focusedonthehealthandcultivatedit,watereditandshedalighttoit,realizedit.optimism,…

    2022年7月18日
    16
  • 【Android】PreferenceFragment「建议收藏」

    【Android】PreferenceFragment「建议收藏」调用PreferenceFragment类出错,用了我三天时间才搞定,查官方文档,看百度最后在这位大佬的帖子帮助下终于搞定了。https://blog.csdn.net/cqx13763055264/article/details/78498419#commentBoxPreferenceActivity创建和使用比较复杂,Android官方现在不建议使用了,使用Preferenc…

    2022年9月3日
    2
  • linux关闭防火墙命令_防火墙配置策略

    linux关闭防火墙命令_防火墙配置策略在外部访问CentOS中部署应用时,需要关闭防火墙。关闭防火墙命令:systemctlstopfirewalld.service开启防火墙:systemctlstartfirewalld.service关闭开机自启动:systemctldisablefirewalld.service开启开机启动:systemctlenablefirewalld.service…

    2022年9月6日
    4

发表回复

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

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