在掌握了基本的繼承關係時,爲了加深理解和延伸知識,可以實現以下幾個特殊的類:
1.實現一個不能被繼承的類:
實現原理: 將類的構造函數聲明成私有的。
class AA { //實現一個不能被繼承的類----將基類的構造函數和析構函數聲明成私有的,當派生類要構造基類時,就會因爲
//無法調用基類的構造函數而出錯
public:
static AA* GetObj()
{
return new AA;
}
static AA* DelObj(AA *pa)
{
delete pa;
pa = NULL;
}
private:
AA(){}
~AA(){}
};
int main()
{
AA *pc = AA::GetObj();
AA *pd = AA::DelObj(pc);
return 0;
}
2.實現一個只能在棧上創建對象的類
class AA { //實現一個只能在棧上創建對象的類---1.將構造函數定義成私有的,只提供在棧上創建對象的方法
// 2.將 operator new 重載爲私有
public:
static AA GetObj()
{
return AA();
}
private:
AA(int a = 0)
:_a(a)
{}
//2.產生堆對象的唯一方法是使用new, 禁止使用new就可禁止產生堆對象.由於new執行時會調用operator new,
//而operator new是可重載的, 所以將operator new和operator delete重載爲private即可,
//但是該方法有缺陷--也能在靜態區創建對象
//static void* operator new(size_t size);
//static void operator delete(void *p);
int _a;
};
AA bb = AA::GetObj();
int main()
{
AA aa = AA::GetObj();
bb = aa;
//AA *p = new AA;//編譯報錯---operator new + 構造函數
return 0;
}
3.實現一個只能在堆上創建對象的類
爲了防止先調用類提供的公有方法創建堆上的對象後,再利用拷貝構造函數和賦值運算符的重載而創建棧上的對象,這裏提出類的防拷貝的操作,即將類的拷貝構造和賦值運算符的重載皆聲明爲私有。
class AA { //實現一個只能在堆上創建對象的類---1.將構造函數聲明稱私有
public:
static AA& GetObj() //返回引用
{
return *(new AA);
}
static AA* GetObj2(int n = 1) //返回指針
{
return new AA(n);
}
static AA* GetObj3(int n = 1) //返回指針
{
return new AA[n];
}
private:
類的防拷貝: 1.聲明成私有 2.只進行聲明不定義
AA(const AA& a);
AA& operator=(const AA& a);
AA(int a = 0)
:_a(a)
{}
int _a;
};
int main()
{
AA *p = AA::GetObj2(10); //在堆上創建一個對象初始化_a爲10
AA *p2 = AA::GetObj3(10); //在對上創建10個對象,_a都被默認的初始化爲10
return 0;
}