我有一個基類內的虛函數和該基類的幾個派生類。當其他人被調用時,我沒有接到虛擬函數的調用。錯過了一個虛函數調用
我的基類:
class C_ANY
{
public:
enum EDataTypeID {
eANY = 1, eBOOL, eSINT, eINT, eDINT, eLINT, eUSINT,
eUINT, eUDINT, eULINT, eBYTE, eWORD, eDWORD, eLWORD,
eDATE, eTIME_OF_DAY, eDATE_AND_TIME, eTIME, eREAL, eLREAL, eSTRING,
eWSTRING
};
C_ANY(void);
virtual ~C_ANY() {}
virtual EDataTypeID getDataTypeID() const {
return C_ANY::eANY;
}
};
我的派生類
class C_ANY_ELEMENTARY : public C_ANY {
public:
C_ANY_ELEMENTARY() :
C_ANY() {
}
virtual ~C_ANY_ELEMENTARY() {
}
virtual EDataTypeID getDataTypeID() const {
return C_ANY::eANY;
}
};
class C_ANY_BIT : public C_ANY_ELEMENTARY {
public:
virtual ~C_ANY_BIT() {
}
protected:
C_ANY_BIT() :
C_ANY_ELEMENTARY() {
}
};
class C_BOOL : public C_ANY_BIT {
public:
typedef bool ValueType;
C_BOOL(void);
virtual ~C_BOOL() {
}
virtual EDataTypeID getDataTypeId() const {
return C_ANY::eBOOL;
}
};
class C_ANY_STRING : public C_ANY_ELEMENTARY {
public:
virtual ~C_ANY_STRING() {}
C_ANY_STRING() {
}
};
class C_WSTRING : public C_ANY_STRING
{
public:
C_WSTRING() {
}
virtual ~C_WSTRING() {
}
virtual EDataTypeID getDataTypeID() const {
return C_ANY::eWSTRING;
}
};
我創建一個std ::地圖列表存儲派生類指針的基礎上使用的數據類型的列表。因爲所有派生類都來自基類C_ANY
我返回類型爲C_ANY
類的指針。
C_ANY * DatatypeHandler::CreateDataTypeInstance(C_ANY::EDataTypeID type)
{
switch (type)
{
case C_ANY::eANY: {
C_ANY *ptr = new C_ANY();
return ((ptr != NULL) ? ptr : NULL);
}
break;
case C_ANY::eBOOL: {
C_BOOL *ptr = new C_BOOL();
return ((ptr != NULL) ? ptr : NULL);
}
break;
case C_ANY::eWSTRING: {
C_WSTRING *ptr = new C_WSTRING();
return ((ptr != NULL) ? ptr : NULL);
}
break;
}
return NULL;
}
typedef std::map<C_ANY::EDataTypeID, C_ANY*> DataTypeList;
DataTypeList _dataTypeList;
void CreateDataTypeInstance(C_ANY::EDataTypeID type)
{
DataTypeList::const_iterator iter = _dataTypeList.find(type);
if (iter == _dataTypeList.end())
{
_dataTypeList.insert(make_pair(type, DatatypeHandler::getInstance().CreateDataTypeInstance(type)));
}
}
檢查如下數據類型值:
void checkDataType(C_ANY::EDataTypeID type) {
printf("\n UpdataDataVar : %d, %d", type,_dataTypeList[type]->getDataTypeID());
DataTypeList::const_iterator iter = _dataTypeList.find(type);
printf("\n iterator : %d, %d", iter->first, iter->second->getDataTypeID());
}
我得到的輸出如下。我不明白什麼是真正的問題,爲什麼它打印正確的值爲eANY和eWSTRING和爲什麼不爲eBOOL。
UpdataDataVar : 2, 1 <<<< Issue is This <<<<<<
iterator : 2, 1 <<<< Issue is This <<<<<<
UpdataDataVar : 22, 22
iterator : 22, 22
UpdataDataVar : 1, 1
iterator : 1, 1
備註:請不要命名類似MACRO_S。你不需要在new之後進行nullptr測試(它會拋出一個異常,除非你使用新的(std :: nothrow)T) –
@DieterLücking,而且甚至**如果使用no-throw版本的'new' ,'return((ptr!= NULL)?ptr:NULL);'仍然和'return ptr'具有完全相同的效果。 – SergeyA
side-topic:[爲什麼不是匈牙利符號](http://stackoverflow.com/questions/111933/why-shouldnt-i-use-hungarian-notation) – dwanderson