DTLib - 顶层父类的创建

1、顶层父类的创建 

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

               -尽量使用单重继承的方式进行系统设计 

               -尽量保持系统中只存在单一的继承树 

               -尽量使用组合关系代替继承关系 

不幸的事实 

               -C++语言的灵活性使得代码中可以存在多个继承树 

               -C++编译器的差异使得同样的代码可能表现不同的行为 

                     如:new操作如果失败会发生什么?(不清楚的参考https://blog.csdn.net/qq_39654127/article/details/79870658

创建DTLib: :Object类的意义 

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

               -定义动态内存申请的行为,提高代码的移植性

 

2、编程实验 

顶层父类的创建     DTLib.pro

Object.h

#ifndef OBJECT_H
#define OBJECT_H

namespace DTLib
{
#ifndef NULL
#define NULL 0
#endif

// 顶层父类
class Object
{
public:
    // 自定义动态内存申请的行为
    void* operator new (unsigned int size) throw();
    void operator delete (void* p) throw();

    void* operator new[] (unsigned int size) throw();
    void operator delete[] (void* p) throw();

    // 子类对象可以直接比较
    bool operator == (const Object& obj);
    bool operator != (const Object& obj);

    // 待加功能

    virtual ~Object() = 0; // 顶层父类应该为抽象类
};
}
#endif // OBJECT_H

Object.cpp

#include "Object.h"
#include <cstdlib>
//#include <iostream>

using namespace DTLib;

void* Object::operator new(unsigned int size) throw()
{
    // std::cout << "Object::operator new : " << size << std::endl;
    return malloc(size); // 内存申请失败时返回NULL,不抛出任何异常
}
void Object::operator delete(void* p) throw()
{
    // std::cout << "Object::operator delete : " << p << std::endl;
    free(p);
}

void* Object::operator new[](unsigned int size) throw()
{
    return malloc(size);
}
void Object::operator delete[](void* p) throw()
{
    free(p);
}

bool Object::operator==(const Object& obj)
{
    return this == &obj;
}
bool Object::operator!=(const Object& obj)
{
    return this != &obj;
}

Object::~Object()
{

}

main.cpp

#include <iostream>
#include "Object.h"

using namespace std;
using namespace DTLib;

// 继承至顶层父类的数据结构
class Test : public Object
{
public:
    int i;
    int j;

    ~Test()
    {
        cout << "~Test()" << endl;
    }
};
class Child : public Test
{
public:
    int k;

    ~Child()
    {
        cout << "~Child()" << endl;
    }
};

int main()
{
    Object* obj1 = new Test();
    Object* obj2 = new Child();

    cout << "obj1 = " << obj1 << endl;
    cout << "obj2 = " << obj2 << endl;


    delete obj1;  // 发生了多态
    delete obj2;

    return 0;
}

   

new,delete调用了顶层父类的实现,顶层父类为纯虚析构,delete Object指针时,发生多态析构子类对象

 

3、类族结构的进化

遵循经典设计准则 

                  - DTLib中的所有类位于单一的继承树 

                         以后创建的所有数据结构都继承至顶层父类

DTLib的开发方式和注意事项 

               -迭代开发 

                       每次完成—个小的目标,持续开发,最终打造可复用类库 

              -单—继承树 

                      所有类都继承自Object, 规范堆对象创建时的行为 

              -只抛异常,不处理异常 

                      使用THROW _EXCEPTION抛出异常,提高可移植性 

              -弱耦合性 

                      尽量不使用标准库中的类和函数,提高可移植性 

4、小结

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

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

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

            Object类为纯虚父类所有子类都能进行动态类型识别 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值