• 顶层父类


    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类为纯虚父类,所有子类都能进行动态类型识别。

  • 相关阅读:
    fiddler抓取java系程序的网络通信
    ZOJ 2724 Windows Message Queue(优先队列)
    FZU 电动车通行证制度
    Havel定理
    Catch That Cow
    Trie树
    zoj 2876 Phone List
    zoj 2420
    getchar
    zoj 1315 Excuses, Excuses!
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/9562253.html
Copyright © 2020-2023  润新知