c++ dynamic_cast与static_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)。
#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地址,可知地址一样。
相关推荐
-
C/C++中static,const,inline三种关键字详细总结
一.关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static 的两大作用: 一.控制存储方式 static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间. 引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保
-
C++中四种对象生存期和作用域以及static的用法总结分析
一.四种对象生存期和作用域 栈对象隐含调用构造函数(程序中没有显式调用) 堆对象隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静态局部对象 已初始化的静态局部变量存储于.data段中 未初始化的静态局部变量存储于.bss段中 复制代码 代码如下: #include <iostream>using namespace std;cl
-
关于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<
-
C++中静态成员函数与静态成员变量(static )
C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回忆起来. 复习C语言的static关键字 (1)加在局部变量的前面使之成为静态局部变量,作用域还是在函数内部,可是生存周期延长了. (2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行.这在C语言的多人项目中非常有用,避免了变量的重名.然而在C+
-
关于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_assert的使用
断言和用户提供的消息 C++ 语言支持可帮助您调试应用程序的三个错误处理机制:#error 指令.static_assert 关键字和 assert (CRT) 宏.所有的三种机制都会发出错误消息,其中两个还会测试软件断言.软件断言指定在程序的某个特定点应满足的条件.如果编译时断言失败,编译器将发出诊断消息和编译错误.如果运行时断言失败,操作系统将发出诊断消息并关闭应用程序. 备注 应用程序的生存期由预处理.编译和运行时阶段组成.每个错误处理机制都会访问在这三个阶段之一中可用的调试信息.若要有效
-
由static_cast和dynamic_cast到C++对象占用内存的全面分析
static_cast和dynamic_cast是C++的类型转换操作符.编译器隐式执行的任何类型转换都可以由static_cast显式完成,即父类和子类之间也可以利用static_cast进行转换.而dynamic_cast只能用于类之间的转换.那么dynamic_cast的存在还有什么意义呢?因为dynamic_cast提供了一个重要的特性:运行时类型检查来保证转换的安全性. 用static_cast转换存在的危险 我们知道,一个基类指针不需要进行明确的转换操作,就可以指向基类对象或者派生类
-
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
随机推荐
- 30分钟入门Java8之方法引用学习
- 正则表达式不包含align该怎么写
- java回调机制实例详解
- Oracle的默认用户密码
- oracle 触发器 学习笔记
- 代码实现打印功能(asp.net+javascript)
- 使用微信PC端的截图dll库实现微信截图功能
- php park、unpark、ord 函数使用方法(二进制流接口应用实例)
- ThinkPHP实例化模型的四种方法概述
- 全面了解js中的script标签
- JS中call/apply、arguments、undefined/null方法详解
- Shell编程中while与for的区别及用法详解
- PHP访问Google Search API的方法
- SqlServer编写数据库表的操作方式(建库、建表、修改语句)
- C#中的ICustomFormatter及IFormatProvider接口用法揭秘
- 用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
- 基于mysql的论坛(7)
- C++中的四个默认成员函数与运算符重载详解
- 10分钟教你用Python实现微信自动回复功能
- vue spa应用中的路由缓存问题与解决方案