目录
当代软件结构实践中的经验
- 尽量使用单重继承的方式进行系统设计
- 尽量保持系统中只存在单一的继承树
- 尽量使用组合关系替代继承关系
不幸的事实
- C++语言的灵活性使得代码中可以存在多个继承树
- C++编译器的差异使得同样的代码可能表现出不同的行为
new
操作如果失败会发生什么?
创建JQLib::Object类的意义
- 遵循经典设计准则,所有数据结构都继承自Object类
- 定义动态内存申请的行为,提高代码的移植性
顶层父类的接口定义
编程实验:顶层父类的创建
Object.h
#ifndef OBJECT_H
#define OBJECT_H
#define OBJECT_TEST
namespace JQLib
{
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
Object.cpp
#include "Object.h"
#include <cstdlib>
#include <iostream>
using namespace std;
namespace JQLib
{
void* Object::operator new(unsigned int size) throw()
{
//cout<<"Object::operator new size = "<<size<<endl;
return malloc(size);
}
void Object::operator delete(void* p)
{
//cout<<"Object::operator delete p = "<<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()
{
//cout<<"Object::~Object()"<<endl;
}
}
main.cpp
#include <iostream>
#include "SmartPointer.h"
#include "Exception.h"
#include "Object.h"
using namespace std;
using namespace JQLib;
#ifdef OBJECT_TEST
class Test : public Object
{
public:
int i;
int j;
};
class Child : public Test
{
public:
int k;
};
int main()
{
Object* obj1 = new Test();//size = 12==>8+虚函数指针=12
Object* obj2 = new Child();//size = 16==>8+4+虚函数指针=16
//....
cout<<"obj1 = "<<obj1<<endl;
cout<<"obj2 = "<<obj2<<endl;
delete obj1;
delete obj2;
return 0;
}
#endif
小结
- Object类是JQLib中数据结构类的顶层父类
- Object类用于同一动态内存申请的行为
- 在堆中创建Object子类的对象,失败时返回NULL值
- Object类为纯虚父类,所有子类都能进行动态类型识别