关键字:顶层父类、单一继承树、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. 顶层父类的实现
#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