2019独角兽企业重金招聘Python工程师标准>>>

先看代码:

#include <iostream>using namespace std;class A
{
public:A() {cout << "A" << endl;}virtual ~A() {cout << "~A" << endl;}virtual void print() {cout << "A::Print()" << endl;}
};class B : public A
{
public:B(int i) : index(i) {cout << "B" << endl;}virtual ~B() {cout << "~B" << endl;}virtual void print() {cout << "B::Print(),index=" << index << endl;}int index;
};int main(int argc, char *argv[])
{A* pA = new A();B* pB = new B(1);A* pAB = new B(5);B* pBA = static_cast<B*>(pA);B* pBB = static_cast<B*>(pB);B* pBAB = static_cast<B*>(pAB);if (pBA) {pBA->print();}if (pBB) {pBB->print();}if (pBAB) {pBAB->print();}delete pA;delete pB;return 0;
}

执行结果:

A
A
B
A
B
A::Print()
B::Print(),index=1
B::Print(),index=5
~A
~B
~A

pBB和pBAB没有任何问题,其本身就是B对象。pBA是从基类转换为B对象,但是调用的却是A::Print(),因为pA对象并没有构建B对象的内存,构建的仅是基类的内存,因此输出基类的print()。

现在改动代码,将A中的print函数去掉:

class A
{
public:A() {cout << "A" << endl;}virtual ~A() {cout << "~A" << endl;}/*virtual void print() {cout << "A::Print()" << endl;}*/
};

程序在A::print()处崩溃!因为基类已经没有print()函数了。这里的pBA类型转换是由基类构造的对象变为派生类的指针,隐藏一个严重的程序BUG,但是编译器并没有在这里给与任何提示,还转换成功,得到了相应的B对象指针。

接下来使用dynamic_cast进行类型转换:

    B* pBA = dynamic_cast<B*>(pA);B* pBB = dynamic_cast<B*>(pB);B* pBAB = dynamic_cast<B*>(pAB);

程序调试结果,pBA转换后为0,并没有转换成功,就可以在这里对转换对象进行判断。

因此在使用基本类型进行转换时,用static_cast,在涉及到对象之间的转换时用dynamic_cast。

float val = 10.00f;

int iVal = static_cast<int>(val);

A* pA = new B();

B* pB = dynamic_cast<B*>(pA);

if (pB != nullptr) {

pB->dosomething();

}

转载于:https://my.oschina.net/u/3489228/blog/1571524

基类和派生类中使用static_cast和dynamic_cast进行类型转换相关推荐

  1. C++中基类与派生类的构造函数和析构函数

    1.Cpp中的基类与派生类的构造函数 基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承.构造函数不能被继承是有道理的,因为即使继承了,它的名字和 ...

  2. c++中基类与派生类中隐含的this指针的分析

    先不要看结果,看一下你是否真正了解了this指针? 1 #include<iostream> 2 using namespace std; 3 4 class Parent{ 5 publ ...

  3. python根据一个基类生成派生类_python中的封装继承多态

    1.封装 类的封装可以隐藏类的实现细节,迫使用户只能通过方法去访问数据,这样就可以增强程序的安全性.接下来演示未使用封装可能出现的问题,如例所示. 在例中,运行结果输出的成绩为-68,在程序中不会有任 ...

  4. 派生类到基类的转换 和基类到派生类的转换

    一. 基类与派生类的转换     3种继承方式(公用.保护.私有继承)中,公用派生类才是基类真正的子类型,它完整地继承了基类的功能.     不同类型数据之间在一定条件下可以进行类型的转换.基类与派生 ...

  5. C++:基类和派生类

    4.1 派生类的声明 继承实例如下: class Person{ //声明基类Person public:void print(){cout<<"name:"<& ...

  6. 基类与派生类之间的转换关系

    一. 派生类到基类的转换: 1.可以使用派生类指针初始化基类指针,同样也可以使用派生类的引用或对象初始化基类的引用,注意这里提到的是对象的指针和引用而不是对象本身: (但是,在使用基类指针(或引用)指 ...

  7. 构造函数怎么在主函数调用_C++ 虚基类及其派生类构造函数(学习笔记:第7章 12)...

    虚基类及其派生类构造函数[1] 建立对象时所指定的类称为最远派生类. 虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的. 在整个继承结构中,直接或间接继承虚基类的所有派生类,都 ...

  8. 基类与派生类的类型转换

    类型转换规则: 公有派生类对象可以被当作基类的对象使用,反之则不可 派生类的对象可以隐含转换为基类对象 派生类的对象可以初始化基类的引用 派生类的指针可以隐含转换为基类的指针 通过基类对象名,指针只能 ...

  9. java基类和派生类圆_java – 当基类和派生类都具有相同名称的变量时会发生什么...

    在这些类中考虑int变量: class Foo { public int a = 3; public void addFive() { a += 5; System.out.print("f ...

最新文章

  1. iOS单个应用程序的最大可用内存是多少?
  2. linux中用户的权限是什么,linux中用户权限设置与更改相关介绍(上)
  3. tensorflow 添加官方代码--以leaky_relu为例
  4. stm32之通用定时器
  5. CCF 2015年题目题解 - Python
  6. 学习计划2016//12/12
  7. [算法] 麻将序数牌组合方案
  8. mysql聚合索引创建_为 MySQL 查询优化选择最佳索引
  9. 【Linux】Linux的常用远程工具
  10. MAGENTO DEBUG
  11. python画三维图-Python+matplotlib绘制三维图形5个精选案例
  12. Unity下载安装教程
  13. 《Redis开发与运维》----- 客户端
  14. bt 介绍以及 bt 种子的hash值(特征值)计算
  15. udp接受_电脑网络基础知识:用户数据报协议(UDP)的学习
  16. Java中,如何把ascii码转换成字符?
  17. R语言基础 期中考试
  18. k8s client-go 出现错误net/http: TLS handshake timeout
  19. CentOS修改Tomcat端口号
  20. nginx的rewrite中last和break 及 permanent和redirect的介绍

热门文章

  1. 配置交换机etherchannel
  2. [转]数据库性能优化(老Key)
  3. Centos安装postgreSQL
  4. PAT 乙级 1041 考试座位号
  5. java-------------华为-----------字符串链接最长路径查询
  6. 《黑马程序员》认识OC的第一个程序(Objective-c)
  7. Storage Options
  8. vb中如何才能有手型的光标?
  9. Shell中判断字符串是否为数字的6种方法分享
  10. 增强现实(Augmented Reality)浅谈