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)
上一篇 2022年7月4日 上午6:36
下一篇 2022年7月4日 上午6:36


相关推荐

  • 人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题

    人工智能猴子摘香蕉问题状态过程_人工智能原理猴子吃香蕉问题题目:利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图1所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再爬到箱子上。请定义必要的谓词,列出问题的初始化状态(即下图所示状态),目标状态(猴子拿到了香蕉,站在箱子上,箱子位于位置b)。(附加:从初始状态到目标状态的谓词演算过程。)1.定义描述环境状态的谓词。AT(x,w):x在w处,个体域:x?{monkey},w?{a,b,c,box};HOLD(x,t):x手中拿着t,个体域:t?{box,ba

    2026年4月14日
    7
  • kettle环境搭建_kettle配置文件在哪

    kettle环境搭建_kettle配置文件在哪kettle工具环境配置欢迎使用Markdown编辑器kettle的配置Java环境配置欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。kettle的配置地址:https://sourceforge.net/projects/penta…

    2022年10月16日
    7
  • vpp安装运行

    vpp安装运行有 2 点 1 如果编译完没有 dpdk 比如没有 igb uio ko 可以自己编译安装 见我另一篇博文 2 vpp 编译出来的 RPM 安装后 一定要根据个人及其情况进行配置 不要直接 reboot 可能导致起不来 etc sysctl d 80 vpp conf 重要 设置大页 和 99 systl conf usr lib sysctl d 00 system conf 和 50 def

    2026年3月17日
    2
  • Android弹出多选框设计

    Android弹出多选框设计程序代码功能 点击一个按钮弹出一个多选框在 activity main xml 布局一个 button 控件 大小 颜色 位置 背景可自行调节 以被用来在 MainActivity java 调用其 id 来实现点击弹出多选框 在 btn1 setOnClickLi newView OnClickListe Overridepubl Viewview 大括号内放入点击 btn1 时间要发生的内容 因为是弹出多选框 所以用来 Alter Bui

    2026年3月17日
    2
  • pytest-allure_allure的用法

    pytest-allure_allure的用法前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

    2022年7月28日
    11
  • 关于pin码破解的原理和reaver参数的解释「建议收藏」

    关于pin码破解的原理和reaver参数的解释「建议收藏」  路由器开启wps功能后,会随机生成一个8位的pin码,通过暴力枚举pin码,达到破解的目的,尤其现在很多路由器默认开启了wps功能。大家可能会想到8位的随机pin码将会有100000000种情况,这要pin到何年何月呀。。。。。。不过接下来讲解一下原理,大家会发现其实没多少种情况,这也是这种攻击方式比较流行的原因。 1.pin码破解的原理:  pin码是由8位纯数字组成的识别码,pin码破解是分三部分进行的,规律是这样的:pin码分为三部分,如图:      前4位为…

    2022年5月11日
    56

发表回复

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

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