12_顶层父类的创建

关键字:顶层父类、单一继承树、Object类的定义与实现

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

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

当用C++语言开发一个面向对象的系统时,不要使用多继承,使用单重继承实现多个接口的方式进行系统设计。重点强调可以使用多个接口,但是继承只能是一对一的继承,不要实现多重继承。

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

实现方式:创建一个顶层的抽象父类

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

2. 不幸的事实

  • C++语言的灵活性使得代码可以存在多个继承树
  • C++没有官方的编译器,在不同的编译器的环境下使得同样的代码可能表现不同的行为

如:new操作失败会发生什么?
在早期的编译器中,new操作失败会返回一个空指针;
在现代的编译器中,new操作失败会抛出一个异常。

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

  • 遵循经典设计准则,让所有数据结构都继承自顶层的Object类
  • 这样就规范了动态内存申请的行为,可以不使用编译器new的行为,自定义new的行为,保障了不同的编译器中行为的一致性,提高代码的移植性

4. 顶层父类的接口定义

class Object
{
public:
    void* operator new (unsigned int size) throw(); // throw()表示当前的函数不会抛出任何异常
    void operator delete (void* p);
    void* operator new[] (unsigned int size) throw();
    void operator delete[] (void* p);
    virtual ~Object() = 0;
};

5. 顶层父类的实现

Object.h

#ifndef OBJECT_H
#define OBJECT_H

namespace DTLib
{

class Object
{
public:
    void* operator new (unsigned int size) throw(); // throw()表示当前的函数不会抛出任何异常
    void operator delete (void* p);
    void* operator new[] (unsigned int size) throw();
    void operator delete[] (void* p);
    virtual ~Object() = 0;
};

void* Object::operator new (unsigned int size) throw()
{
    return malloc(size);
}

void Object::operator delete (void* p)
{
    free(p);
}

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

void Object::operator delete[] (void* p)
{
    free(p);
}

Object::~Object()
{

}

}

#endif // OBJECT_H

6. 小结

  • Object类是DTLib中数据结构类的顶层父类
  • Object类用于统一动态内存申请的行为
  • 在堆中创建Object子类的对象,失败时返回NULL值
  • Object类为纯虚父类,所有子类都能进行动态类型识别

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

    原文作者:jacob2359
    原文地址: https://www.jianshu.com/p/220d8ec3bece
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞