设为首页 加入收藏

TOP

C++中的new/delete、构造/析构函数、dynamic_cast分析(三)
2019-05-24 12:07:54 】 浏览:150
Tags:new/delete 构造 函数 dynamic_cast分析
~Derived(),Base::func(), ~Base();
61 62 return 0; 63 }

 

14,继承中如何正确的使用强制类型转换?

    1,dynamic_cast 是与继承相关的类型转换关键字;

    2,dynamic_cast 要求相关的类中必须有虚函数;

    3,用于有直接或者间接继承关系的指针(引用)之间;

       1,指针:

           1,转换成功:得到目标类型的指针;

           2,转换失败:得到一个空指针;

       2,引用:

           1,转换成功:得到目标类型的引用;

           2,转换失败:得到一个异常操作信息;

    4,编译器会检查 dynamic_cast 的使用是否正确;

       1,在 C++ 编译器中得到足够重视,是非常有地位的一个类型转换关键字;

       2,使用不正确编译器会报错;

    5,类型转换的结果只可能在运行阶段才能得到;

       1,动态的类型转换,转换结果运行阶段才能得到;

   

15,dynamic_cast 的使用编程实验:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 class Base
 7 {
 8 public:
 9     Base()
10     {
11         cout << "Base::Base()" << endl;
12     }
13     
14     virtual ~Base()  // 工程经验;
15     {
16         cout << "Base::~Base()" << endl;
17     }
18 };
19 
20 class Derived : public Base
21 {
22 
23 };
24 
25 int main()
26 {
27 /*  
    Base* p = new Derived;
28 29 Derived* pd = p; // 编译器显示:error:invalid conversion from 'Base*' to 'Derived*'; 30 // 未有虚函数时,用 dynamic_cast 转换,编译器显示:error: cannot dynamic_cast 'p' (of type 'class Base*') to type 'Derived*' (source type is not polymorphic(多态的)) 31 // 有虚函数且用了 dynamic_cast 也要判断 pd 不为空; 32 */ 33 Base* p = new Base; 34 35 Derived* pd = dynamic_cast<Derived*>(p); // 不合法,不能使用子类指针,指向父类对象;编译器编译阶不报错;但是运行时 pd = 0; 意味着此处强制类型转换不成功; 36 37 if( pd != NULL ) // 这样的判断很有必要; 38 { 39 cout << "pd = " << pd << endl; 40 } 41 else 42 { 43 cout << "Cast error!" << endl; 44 } 45 46 delete p; 47 48 return 0; 49 }

    1,在多重继承下面、在单继承加多接口这样的开发模型下面,dynamic_cast 非常重要,可以说 dynamic_cast 就是为了C++ 里面面向对象程序设计而诞生的;

   

16,小结:

    1,new/delete 会触发构造函数或者析构函数的调用;

    2,构造函数不能成为虚函数;

    3,析构函数可以成为虚函数;

    4,构造函数和析构函数中都无法产生多态行为;

    5,dynamic_cast 是与继承相关的专用转换关键字;

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++中函数模板的概念和意义 下一篇C++中的多重继承(一)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目