c++ dynamic_cast与static_cast使用方法示例

首先dynamic_cast:


代码如下:

#include <iostream>
using namespace std;
class A{
    public:
        virtual ~A(){} //使用dynamic_cast时,必要!
};
class B:public A{
    public:
        B(){
            m_b=12;
        }
        void foo(){
            cout<<"B: "<<m_b<<endl;
        }
    private:
        int m_b;
};
int main()
{   
    A *a=new B();
    B *b=dynamic_cast<B*>(a);
    b->foo();
    delete a;
    return 0;
}

上面没有virtual ~A(){},编译时会报错:(source type is not polymorphic)。

static_cast:


代码如下:

#include <iostream>
using namespace std;
class A{
    public:
        A():m_a(32){}
        void foo(){
            cout<<"A: "<<m_a<<endl;
        }
        void setA(int a){
            m_a=a;
        }
    private:
        int m_a;
};
class B:public A{
    public:
        B(){
            m_b=12;
            setA(13);
        }
        void foo(){
            cout<<"B: "<<m_b<<endl;
        }
    private:
        int m_b;
};
int main()
{   
    A *a=new B();
    B *b=static_cast<B*>(a);
    A *aa=static_cast<A*>(b);
    b->foo();
    aa->foo();
    delete a;
    return 0;
}

打印a、b、aa地址,可知地址一样。

(0)

相关推荐

  • 关于C++中的static关键字的总结

    1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: 复制代码 代码如下: //Example 1#include <iostream.h>void fn();static int n; //定义静态全局变量void main(){  n=20;  cout<<n<<endl;  fn();} void fn(){ n++;  cout<<n<

  • 由static_cast和dynamic_cast到C++对象占用内存的全面分析

    static_cast和dynamic_cast是C++的类型转换操作符.编译器隐式执行的任何类型转换都可以由static_cast显式完成,即父类和子类之间也可以利用static_cast进行转换.而dynamic_cast只能用于类之间的转换.那么dynamic_cast的存在还有什么意义呢?因为dynamic_cast提供了一个重要的特性:运行时类型检查来保证转换的安全性. 用static_cast转换存在的危险 我们知道,一个基类指针不需要进行明确的转换操作,就可以指向基类对象或者派生类

  • 详解C++编程中断言static_assert的使用

    断言和用户提供的消息 C++ 语言支持可帮助您调试应用程序的三个错误处理机制:#error 指令.static_assert 关键字和 assert (CRT) 宏.所有的三种机制都会发出错误消息,其中两个还会测试软件断言.软件断言指定在程序的某个特定点应满足的条件.如果编译时断言失败,编译器将发出诊断消息和编译错误.如果运行时断言失败,操作系统将发出诊断消息并关闭应用程序. 备注 应用程序的生存期由预处理.编译和运行时阶段组成.每个错误处理机制都会访问在这三个阶段之一中可用的调试信息.若要有效

  • C++中四种对象生存期和作用域以及static的用法总结分析

    一.四种对象生存期和作用域 栈对象隐含调用构造函数(程序中没有显式调用) 堆对象隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静态局部对象 已初始化的静态局部变量存储于.data段中 未初始化的静态局部变量存储于.bss段中 复制代码 代码如下: #include <iostream>using namespace std;cl

  • 关于C/C++中static关键字的作用总结

    1.先来介绍它的第一条也是最重要的一条:隐藏.(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性.举例来说明.同时编译两个源文件,一个是a.c,另一个是main.c. 复制代码 代码如下: //a.cchar a = 'A';               // global variablevoid msg(){     printf("Hello\n");} 复制代码 代码如下: //main.c int main

  • C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回忆起来. 复习C语言的static关键字 (1)加在局部变量的前面使之成为静态局部变量,作用域还是在函数内部,可是生存周期延长了. (2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行.这在C语言的多人项目中非常有用,避免了变量的重名.然而在C+

  • C/C++中static,const,inline三种关键字详细总结

    一.关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一.控制存储方式 static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间. 引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保

  • C++类中的static和const用法实例教程

    static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法.供大家参考借鉴.具体说明如下: 首先以代码用来举例说明.示例代码如下: class A { public: A():m(10) //const成员必须在构造函数的初始化构造列表中初始化 { q = 40; } void fun1()const { m++; //错误.const成员是常量,不能改变其值. n++; //正确.static变量n属于类,但是每个对象的函数都可以访

  • c++ dynamic_cast与static_cast使用方法示例

    首先dynamic_cast: 复制代码 代码如下: #include <iostream>using namespace std;class A{    public:        virtual ~A(){} //使用dynamic_cast时,必要!};class B:public A{    public:        B(){            m_b=12;        }        void foo(){            cout<<"B

  • 浅析C++中dynamic_cast和static_cast实例语法详解

    目录 1. static_cast 1.2 为什么要有static_cast等 1.2 static_cast的作用 1.3 static_cast用法 2. dynamic_cast 2.1 dynamic_cast 语法 2.2 dynamic_cast 用法 2.3 dynamic_cast 实例 1. static_cast 1.1 static_cast语法 static_cast< new_type >(expression) 备注:new_type为目标数据类型,expressi

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • Oracle数据行拆分多行方法示例

    工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比. 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_substr('444.555.666', '[^.]+', 1, level) col from dual connect by level <= regexp_count('444.555.666', '\.') + 1 输出结果: COL ---- 444 555 666 多行拆分 如果数据表

  • swift 3.0中实现字符串截取、比较的方法示例

    前言 字符串处理一直都是程序开发中不可避免的,而字符串截取/替换操作更是频繁.swift3.0 中不能直接使用下标数字进行字符串解决,只能使用String.Index来做位置索引,要想实现截取功能首先得获取到String.Index; 下面话不多说了,来一起看看详细的介绍吧. 实例代码 下面两段代码获取开头可结尾,获取中间部分参数用Range<Index>即可: 获取结尾两个字符子串: let sessionId = "this is a test" let index =

  • 使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)

    这是一个示例: <html> <head> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script type="text/javascript"> $(document).ready(function(){ $(".btn1").cl

  • vue不通过路由直接获取url中参数的方法示例

    前言 众所周知vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接在url后面拼接?mid=100的方式传递参数更灵活,你不需要设置路由,只需要在url后拼接参数即可,但是这种方式就需要通过javascript获取并提取url中的参数,通过传统的方式直接在页面中获取是行不通的了,因为vue中是无法通过location.search()来获取url问号之后的内容的. 当然,这个问题也有解决方法,就是把

  • 微信小程序实现实时圆形进度条的方法示例

    前言 最近工作中为了做一个录制按钮,研究了下小程序的实时圆形进度条实现,下面这篇文章就来给大家详细的介绍了实现的方法示例,废话不多说,先来看看效果图吧. 效果图如下 初始状态 点击中间按钮开始绘制 绘制过程 绘制结束 实现思路 建立两个canvas标签,先绘制底层的浅灰色圆圈背景,再绘制上层的红色进度条. WXML代码 <view class="wrap"> <view class="circle-box"> <canvas class

  • Ionic + Angular.js实现图片轮播的方法示例

    本文主要给大家介绍了关于Ionic + Angular实现图片轮播的相关资料,分享出来供大家参考学习,需要的朋友们下面来一起看看吧. 先来看看实现的效果图: 方法示例: template文件夹新建slider.html <ion-view view-title="图片轮播"> <ion-content class="padding" scroll="false"> <ion-slides class="sl

  • 利用Java如何获取IP与机器名方法示例

    前言 本文详细给大家介绍了关于利用Java如何获取IP与机器名的方法示例,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一.通过IP获取机器名 or 通过机器名获取ip host :主机        hostAddress :ip       hostName:机器名 import java.net.InetAddress; import java.net.UnknownHostException; public class Test01 { public static voi

随机推荐