實現一個不能被繼承的類

在掌握了基本的繼承關係時,爲了加深理解和延伸知識,可以實現以下幾個特殊的類:

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;
}




爲了防止先調用類提供的公有方法創建堆上的對象後,在
發佈了102 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章