【數據結構實戰C++】12 頂層父類的創建

【數據結構實戰C++】12 頂層父類的創建

作者 CodeAllen ,轉載請註明出處


當代軟件架構時間中的經驗

  • 儘量使用單重繼承的方式進行系統設計
  • 儘量保持系統中只存在單一的繼承樹
  • 儘量使用組合關係代替繼承關係

不幸的事實

  • c++語言的靈活性似的代碼中可以存在多個繼承樹
  • c++編譯器的差異使得同樣的代碼可能表現出不同的行爲

舉例:new操作失敗會發生什麼?
返回空指針?
有些編譯器是返回空指針,但是很多現代編譯器會拋出特殊的庫中的異常。
這就導致不同的平臺代碼複用度降低

解決方案:可以自定義類 ::object

  • 遵循經典設計規則,所有數據結構都繼承自object類
  • 定義動態內存申請行爲,提高代碼的移植性

那麼,頂層的父類接口可以定義:
在這裏插入圖片描述

實驗:創建頂層父類
Object.cpp

#include "Object.h"
#include <cstdlib>
#include <iostream>
using namespace std;
namespace KKLib
{
void* Object::operator new (unsigned int size) throw()  //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()
{
    return malloc(size);
}
void Object::operator delete[] (void* p)
{
    free(p);
}
Object::~Object()
{
}
}

Object.h

#ifndef OBJECT_H
#define OBJECT_H
namespace KKLib
{
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類是數據結構類的頂層父類
Object類用於統一動態內存申請的行爲
在堆中創建Object子類的對象,失敗時返回NULL
Object類爲純虛父類,所有子類都能進行動態類型識別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章