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