下面是我犯的一个错误,与大家共享教训:
MFC的文件类Cfile没有提供通写(WriteThrough)功能,所以就重载了CFile,目的是重新实现基类虚函数Open,派生类CwriteThroughFile,定义如下:
class _NCLIB_EXP CWriteThroughFile : public CFile
{
public:
// Constructors
CWriteThroughFile()
{}
CWriteThroughFile(int hFile)
: CFile(hFile) {}
CWriteThroughFile(LPCTSTR lpszFileName, UINT nOpenFlags)
: CFile(lpszFileName, nOpenFlags) {}
virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pError = NULL);
};
应用该类的代码:
try
{
CWriteThroughFile _file(pszDatFileName_, CFile::modeNoTruncate | CFile::modeCreate | CFile::modeReadWrite | CFile::shareDenyWrite);
…
}
}
catch (CFileException* pe_)
{
…
}
但是错误是:这个CwriteThroughFile的对象_file在打开文件时候,并没有调用虚函数CwriteThroughFile::Open,而是调用了基类的Open函数。
教训:
1 我没有仔细测试,是造成错误的直接原因,如果能够单步跟踪一下,一定能够发现问题。
所以无论写多么简单的代码都必须至少单步跟踪一边,不能想当然。这方面已经有很多教训了。
2 这个例子充分说明了在构造函数中调用虚函数的害处。