前两天编程正好遇到这个问题,找了半天没结果.无意中发现了下面的论述:)
摘自《深入浅出MFC》第8章Document-View 深入探討
p537
自定SERIAL 巨集給抽象類別使用
你是知道的,所謂抽象類別就是包含純虛擬函式的類別,所謂純虛擬函式就是只有宣告
沒有定義的虛擬函式。所以,你不可能將抽象類別具現化(instantiated)。那麼,
IMPLEMENT_SERIAL 展開所得的這段碼:
CObject* PASCAL class_name::CreateObject() { return new class_name; } 面對如果㆒個抽象類別class_name 就行不通了,編譯時會產生錯誤訊息。這時你得自行
定義巨集如:
#define IMPLEMENT_SERIAL_MY(class_name, base_class_name, wSchema) _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, NULL) CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); return ar; } 也就是,令CreateObject 函式為NULL,這才能夠使用於抽象類別之。
p525
#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) CObject* PASCAL class_name::CreateObject() {return new class_name; } _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, class_name::CreateObject) CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) {pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); return ar; }