
数据结构C++语言实现--准备工作三(顶层父类)
数据结构C++语言实现系列文章的代码实现在智能指针、异常类、顶层父类三大基础类上进行代码实现,本文介绍顶层父类。
1.为什么要创建顶层父类?
当代软件架构实践中尽量使用单重继承的方式进行设计,尽量保持系统中只存在单一的继承树,尽量使用组合关系代替继承关系。
但是,C++语言的灵活性使得代码中可以存在多个继承树,C++编译器的差异使得同样的代码可能表现不同的行为。
问:new 操作如果失败会发生什么?
答:上古时代的编译器new失败返回空指针,而当今编译器new失败会抛出异常,所以我们要使得DataStructLib可复用就得重载new和delete(在顶层父类中完成new和delete的重载)。
2.顶层父类的创建
创建DataStructLib::Object类后,所有数据结构都继承自Object类,遵循经典设计准则。定义动态内存申请的行为,提高代码的移植性。
#ifndef OBJECT_H
#define OBJECT_H
namespace DataStructLib {
class Object
{
public:
void* operator new(long long unsigned int size) throw();
void operator delete(void* p);
void* operator new[](long long unsigned int size) throw();
void operator delete[](void* p);
bool operator==(const Object& obj);
bool operator!=(const Object& obj);
virtual~Object()=0;
};
}
#endif // OBJECT_H
#include "Object.h"
#include <cstdlib>
#define OBJECT_DEBUG
#ifdef OBJECT_DEBUG
#include <iostream>
using namespace std;
#endif
namespace DataStructLib
{
void* Object::operator new(long long unsigned int size) throw()
{
#ifdef OBJECT_DEBUG
cout << "Object::operator new " << size << endl;
#endif
return malloc(size);
}
void Object::operator delete(void* p)
{
#ifdef OBJECT_DEBUG
cout << "Object::operator delete " << p << endl;
#endif
free(p);
}
void* Object::operator new[](long long unsigned int size) throw()
{
return malloc(size);
}
void Object::operator delete[](void* p)
{
free(p);
}
bool Object::operator==(const Object& obj)
{
return (this == &obj);
}
bool Object::operator!=(const Object& obj)
{
return (this != &obj);
}
Object::~Object()
{
}
}
#include <iostream>
#include "Exception.h"
using namespace std;
using namespace DataStructLib;
class Test:public Object
{
public:
int i;
int j;
};
class Child:public Test
{
public:
int k;
};
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 的实现了。
3.小结
Object类是DataStructLib中数据结构类的顶层父类,Object类用于统一动态内存申请的行为,在堆中创建Object子类的对象,失败时返回NULL值,Object类为纯虚父类,所有子类都能进行动态类型识别。
Exception类继承自Object类,堆空间中创建异常对象失败时,返回NULL指针。SmartPointer类继承自Object类,堆空间中创建智能指针对象失败时,返回NULL指针。
到此,我们三大基础设施智能指针、异常类、顶层父类创建完成,后续数据结构的开发都将在此基础进行。
Note: 数据结构实践系列文章中用到了非常多的C++和C语言知识,数据结构系列文章中不再重复讲解,具体可以参考本公众号中C/C++系列文章。
参考资料:《C++ primer》
《C++对象模型》
狄泰软件学院唐佐林老师课程
文章转载自公众号:汽车电子嵌入式
