C++多态学习之向下强制类型转换

向下强制类型转换

在C++中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派生类指针。《C++大学教程第13章,面向对象编程:多态性》

如何进行向下强制类型转换

在C++使用 dynamic_cast 关键字进行向下强制类型转换,代码如下所示:

1class Base{//基类 2public: 3 Base(){}//构造函数 4 virtual void print()const{//虚函数print 5 cout << "父类的print函数"<< endl; 6 } 7 8}; 9 10class A:public Base{//子类A 11public: 12 A(){}//构造函数 13 virtual void print()const{// 14 cout << "子类A的print函数" << endl; 15 } 16}; 17 18class B:public Base{//子类B 19public: 20 B(){}//构造函数 21 virtual void print()const{// 22 cout << "子类B的print函数" << endl; 23 } 24}; 25 26int main(){ 27 Base *pbase = nullptr; 28 A a, *pa = nullptr; 29 B b, *pb = nullptr; 30 31 pbase = &a;//基类指针指向子类A对象 32 cout << "pbase是基类指针,但是指向的是子类A的对象" << endl; 33 pbase->print();//基类指针调用虚函数print,多态,将调用子类A的print 34 35 cout << endl <<"pbase是基类Base类型的指针\n" << "我们将其转换为子类A的指针:" ; 36 pa = dynamic_cast< A* >(pbase); 37 //向下强制类型转换,本来pbase指向的是子类A的对象,因此,该转换是成功的 38 if(nullptr != pa){ 39 cout << "向下强制转换成功" << endl; 40 }else{ 41 cout << "向下强制转换失败" << endl; 42 } 43 44 cout << "\n现在我们将其转换为子类B的指针:"; 45 pb = dynamic_cast< B* >(pbase); 46 //此时pbase还是指向子类A的对象,我们让pbase强制转换成子类B的对象,转失败 47 if(nullptr != pb){ 48 cout << "向下强制转换成功" << endl; 49 }else{ 50 cout << "向下强制转换失败" << endl; 51 } 52 53 //pbase = &b; 54 // pbase->print();//调用子类B的print函数 55 56 return 0; 57}

运行结果如下:

在进行强制类型转换后一般需要判断强制转换是否成功,然后在接着执行进一步操作。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

java8新特性

Stream将List转换为Map,使用Collectors.toMap方法进行转换背景:User类,类中分别有id,name,age三个属性。List集合,userList,存储User对象1、指定keyvalue,value是对象中的某个属性值。 Map<Integer,StringuserMap1userList.str

java中经常问到的面试题

1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例

Java多态实现原理

Java多态概述多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。Java对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用(invokevirtual)和接口引用调用(invokeinterface)的实现则有所不同。类引用调用的大致过程为:Java编译器将Java源代码编译成c

C++中基类虚析构函数的作用及其原理分析

虚析构函数的理论前提是执行完子类的析构函数,那么父类的虚构函数必然会被执行。那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏。故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual。知识背景