12.顶层父类的创建

目录

顶层父类的接口定义

编程实验:顶层父类的创建

小结


当代软件结构实践中的经验

  • 尽量使用单重继承的方式进行系统设计
  • 尽量保持系统中只存在单一的继承树
  • 尽量使用组合关系替代继承关系

 

不幸的事实

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值