【數據結構實戰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類爲純虛父類,所有子類都能進行動態類型識別