class CObject
{
public:
virtual ~CObject(); // virtual destructors are necessary
// Disable the copy constructor and assignment by default so you will get
// compiler errors instead of unexpected behaviour if you pass objects
// by value or assign objects.
protected:
CObject();
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
};
我們看到
1:CObject類的構造函數都不是public類型,因此我們沒能直接去定義一個CObject類型的對象,而必須要用CObject類的派生類去定義定義個對象。
2:爲什麼CObject();是protected類型而不是private類型呢?
這是因爲,CObject類的派生類在定義對象時,只能調用CObject的public類型或protected類型的構造函數,而不能CObject類型的構造函數。
看MFC源代碼:
// CObject
_AFX_INLINE CObject::CObject()
{ }
_AFX_INLINE CObject::~CObject()
{ }
3:
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
拷貝構造函數和賦值運算符重載函數在CObject只進行了聲明而並沒有去真正實現它們。只要我們的程序不去調用CObject類的這兩個函數,那麼程序就不會報錯。一旦我們在程序中調用了這兩個函數中的某一個,程序立馬就會報錯。
在這裏,MFC之所以只在CObject類中聲明瞭這兩個函數而並沒有去實現他們,這是爲了防止在CObject的派生類中出現與“淺拷貝和深拷貝”相關的錯誤。如果我們想在CObject的派生類中使用這兩個函數,就必須在派生類中去真正實現它們。