第十二课、顶层父类的创建------------狄泰软件学院
一、当代软件架构实践中的经验
1、尽量使用单继承的方式进行系统设计(单继承+多个接口的方式)
2、尽量保持系统中只存在单一继承树(创建一个顶层的抽象父类)
3、尽量使用组合关系代替继承关系(后面会讲)
不幸的事实
(1)、c++语言的灵活性使得代码中可以存放多个继承树
(2)、c++编译器的差异使得同样的代码可能表现不同的行为
如:new不成功的时候,以前的编译器都会是返回一个空指针,但是现在一般都会抛出一个异常,不同的编译器抛出的异常可能不一样,这就会使得移植性大大降低
创建DTLib::Object类的意义
(1)、遵循经典设计准则,所有的数据结构都继承自Object类
(2)、定义动态内存申请的行为,提高代码的移植性
二、完整代码
1、头文件
#ifndef OBJECT_H #define OBJECT_H namespace DTLib { class Object { public: void* operator new (unsigned int size) throw(); void operator delete(void* p); void* operator new[] (unsigned int size) throw(); void operator delete[] (void* p); virtual ~Object() = 0; }; } #endif // OBJECT_H
值得注意的是,重载new时函数声明后面都加上了 throw() ,表面new不成功不会抛出任何类型的异常。而将虚函数声明为纯虚函数的意义在于使其子类都用于虚函数表,能进行动态类型识别。
2、实现文件

#include "Object.h" #include <cstdlib> #include <iostream> using namespace std; namespace DTLib { void* Object::operator new (unsigned int size) throw() { cout << "Object::operator new:" << size << endl; return malloc(size); } void Object::operator delete(void* p) { cout << "Object::operator delete" << p << endl; free(p); } void* Object::operator new[] (unsigned int size) throw() { cout << "Object::operator new[]" << endl; return malloc(size); } void Object::operator delete[] (void* p) { cout << "Object::operator delete[]" << endl; free(p); } Object::~Object() { } }
要注意作为纯虚函数的析构函数也要进行定义(那些打印语句只是为了测试方便)
3、测试
#include <iostream> #include "Object.h" using namespace std; using namespace DTLib; 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一个对象时使用了我们重载的版本,同时也含有了指向虚函数表的指针。
三、小结
(1)、Object类是DTLib中数据结构类的顶层父类
(2)、Object类用于统一动态内存申请的行为
(3)、在堆中创建Object子类的对象,失败时返回NULL值
(4)、Object类为纯虚父类,所有子类都能进行动态类型识别
本文作者:lgc202
本文链接:https://www.cnblogs.com/gui-lin/p/6826993.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步