C++学习之两种向下转型
来源:互联网 发布:电脑连接wifi网络差 编辑:程序博客网 时间:2024/06/07 06:42
1)静态转型(强制转换)static_cast<子类指针或引用>(父类指针或引用):把父类的指针或引用强制转换为子类,返回子类的地址,是不安全的转换。[总结]:static_cast< >( )
①.< >中必须是子类的指针或引用
②.( )中的指针指向的是子类空间或者子类对象时,则转型是安全的
1)动态转型(强制转换)dynamic_cast: 把父类指针或引用转换为子类指针或引用,转换成功则返回子类的地址,不成功返回NULL。
[总结]:dynamic_cast< >( )
①.使用dynamic转换时,父类与子类要构成多态条件
②.< >中必须是子类的指针或引用
③.( )中的指针指向的是子类空间或者子类对象时,则转型是安全的
不懂可以参考以下代码理解以及运行结果
#include <iostream>using namespace std;class A{public: A(int _a = 10){ a = _a; } virtual void print(){ cout<<" a= "<<a<<endl; }private: int a;};class B : public A{public: B(int _a=11,int _b =12 ):A(_a){ b = _b; } void print(){ cout<<" b= "<<b<<endl; A::print(); }private: int b;};int main(int argc, const char * argv[]) { A a; B b(20,30); //向下转换的两种形式 /*静态转型(强制转换)static_cast: 把父类指针或引用强制转换为子类指针或引用,返回子类的地址,是不安全的转换。*/ /* 总结:static_cast< >( ) 1.<>中必须是子类的指针或引用 2.()中的指针指向的是子类空间或者子类对象时,则转型是安全的 3. */ /* cout<<"***************静态转换的不安全事例(指针)******************"<<endl; A* a_ptr = &a;//父类指针指向子类空间 0x2 //格式 使用静态转换(强转) B* q = static_cast<B*>(a_ptr); //应该返回NULL表示不成功 把父类指针强转为子类空间 但是父类没有子类的b值,所以不安全 b为随机值 q->print();//b 0 a 10 不安全(指针) cout<<"***************静态转换的安全形式(指针)***************"<<endl; B*w = &b;//0x1 这个空间里有子类的数据,安全 A* m = w;//0x1 B* y = static_cast<B*>(m);//0x1改变指针的类型 而没有改变空间的数据 y->print(); cout<<"***************静态转换的不安全事例(引用)******************"<<endl; B bb = static_cast<B&>(a); bb.print(); cout<<"***************静态转换的安全事例(引用)******************"<<endl; B yy = static_cast<B&>(*m); yy.print(); */ //----------------------------------------------------------------------------------------------------------------------------- /*动态转型(强制转换)dynamic_cast: 把父类指针或引用转换为子类指针或引用,转换成功则返回子类的地址,不成功返回NULL。*/ /* 总结:dynamic_cast< >( ) 1.使用dynamic转换时,父类与子类要构成多态条件 2.<>中必须是子类的指针或引用 3.()中的指针指向的是子类空间或者子类对象时,则转型是安全的 3. */ //使用动态转换 cout<<"**************动态转换对于不安全的处理,返回NULL(指针)*********\n"; A* pp = &a; B* qq = dynamic_cast<B*>(pp);//不安全 qq为NULL if(qq){ cout<<"转换成功\n"; qq->print(); }else{ cout<<"转换不成功\n"; } cout<<"**************动态转换对于不安全的处理,返回NULL(引用)*********\n";// B Derived = dynamic_cast<B&>(a);//崩// Derived.print(); cout<<"**************安全动态转换(指针)*********\n"; B* ptr = &b; A* ptr2 = ptr; B* ptr3 = dynamic_cast<B*>(ptr2); if(ptr3){ cout<<"转换成功\n"; ptr3->print(); } cout<<"**************安全动态转换(引用)*********\n"; B kk = dynamic_cast<B&>(*ptr2); cout<<"转换成功\n"; kk.print(); return 0;}
运行结果:
阅读全文
0 0
- C++学习之两种向下转型
- 向下转型之简介
- Java学习笔记-向上转型,向下转型
- 继承中类型转换的两种方式(向上转型、向下转型)
- 向下转型
- 向下转型
- 向下转型
- 向下转型
- java基础之对象的向下转型
- 多态之向上、向下转型
- Java:多态 之 向下转型+Instanceof关键字
- Java4Android学习六 - 向上转型和向下转型
- java学习(9)java向上转型 向下转型
- 多态之:向下转型和向上转型
- java面向对象之向上转型和向下转型
- Java之向上转型,向下转型简单理解和实例
- 向上转型 向下转型
- 向上转型、向下转型
- 字幕批量翻译 字体定制
- CentOS下VMware用桥接模式,静态ip上外网
- Android如何获得当前应用显示的Activity
- JavaScript定时任务
- Cardiologist-Level Arrhythmia Detection with Convolutional Neural Networks2017
- C++学习之两种向下转型
- 莫比乌斯反演
- react-native之Could not connect to development server
- 文章标题
- opencv 图像载入、显示和输出
- A
- VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
- 算法训练 猴子分苹果
- (hdu1005)Number Sequence(组合数学)