铅笔

在你的害怕中坚持的越多,你就会越自信
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

顶层父类

Posted on 2018-08-30 19:31  黑色の铅笔  阅读(236)  评论(0编辑  收藏  举报

1. 当代软件架构实践中的经验

(1)尽量使用单重继承的方式进行系统设计 (尽量不要一个类继承多个父类)

(2)尽量保持系统中只存在单一的继承树(创建一个顶层得抽象父类)

(3)尽量使用组合关系代替继承关系

2. 不幸的事实

(1)C++语言的灵活性使得代码中可以存在多个继承树(多个继承树会使得代码质量的就下降)

(2)C++编译器的差异使得同样的代码不同的编译器可能表现不同的行为(如new操作结果失败,有的编译器会返回NULL,有的会抛std::bad_alloc异常)

3. 创建DTLib::Object类的意义

(1)遵循经典设计准则,所有数据结构都继承自Object类

(2)定义动态内存申请的行为,提高代码的移植性(即重载operator new,让new的失败时在不同的编译器下都能返回NULL,而不是抛出异常或返回NULL等多种结果)

 

顶层父类接口定义

 1 class Object
 2 {
 3 public:
 4     //以下四个重载函数用于统一不同编译器new失败时的结果不同的问题。
 5     //throw()表示不抛出异常,即如果申请内请失败时,统一返回NULL而不抛异常
 6     void* operator new(unsigned int size) throw();
 7     void operator delete(void* p);
 8     void* operator new[](unsigned int size) throw();
 9     void operator delete[](void* p);
10 
11     virtual ~Object() = 0;
12 };

 

示例代码如下:

 

 object.h

 1 #ifndef OBJECT_H
 2 #define OBJECT_H
 3 
 4 
 5 namespace DTLib
 6 {
 7 
 8     class Object
 9     {
10     public:
11         //以下四个重载函数用于统一不同编译器new失败时的结果不同的问题。
12         //throw()表示不抛出异常,即如果申请内请失败时,统一返回NULL而不抛异常
13         void* operator new(unsigned int size) throw();
14         void operator delete(void* p);
15 
16         void* operator new[](unsigned int size) throw();
17         void operator delete[](void* p);
18 
19         virtual  ~Object()=0;
20     };
21 }
22 #endif // OBJECT_H

object.cp

 1 #include "object.h"
 2 #include "cstdlib"
 3 #include<iostream>
 4 
 5 using namespace std;
 6 namespace DTLib
 7 {
 8 
 9 void* Object::operator new(unsigned int size) throw()
10 {
11     cout<<"Object::operator new : "<< size<<endl;
12     return malloc(size);//这里的size代表申请内存空间的字节数
13 }
14 
15 void Object::operator delete(void* p) 
16 {
17     cout<<"Object::operator delete : "<<p<<endl;
18     
19     free(p);
20 }
21 
22 void* Object::operator new[](unsigned int size) throw()
23 {
24     cout<<"Object::operator new[]"<<endl;
25 
26     return  malloc(size);//此时的size代表申请对象的数量
27 }
28 
29 void Object::operator delete[](void* p)
30 {
31     cout<<"Object::operator delete[]:"<<p<<endl;
32     
33     free(p);
34 }
35 
36 Object::~Object()
37 {
38 
39 }
40 }

测试代码:

 1 #include<iostream>
 2 #include "object.h"
 3 
 4 using namespace std;
 5 using namespace DTLib;
 6 
 7 class Test:public Object
 8 {
 9     int i;
10     int j;
11 public:
12     Test()
13     {
14         cout<<"Test()"<<endl;
15     }
16     ~Test()
17     {
18         cout<<"~Test()"<<endl;
19     }
20 };
21 
22 class Child:public Test
23 {
24     int t;
25 public:
26     Child()
27     {
28         cout<<"Child()"<<endl;
29     }
30     ~Child()
31     {
32         cout<<"~Child()"<<endl;
33     }
34 };
35 
36 int main(int argc, char const *argv[])
37 {
38     Object* object1=new Test();
39     Object* object2=new Child();
40 
41     cout<<"object1 ="<<object1<<endl;
42     cout<<"object2 ="<<object2<<endl;
43 
44     delete object1;
45     delete object2;
46 
47     system("pause");
48     
49     return 0;
50 }

 

 

小结

(1)Object是DTLib中数据结构类的顶层父类

(2)Object类用于统一动态内存申请的行为

(3)在堆中创建Object子类的对象,失败时返回NULL值

(4)Object类为纯虚父类,所有子类都能进行动态类型识别。