~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 是与继承相关的专用转换关键字;
|