gpt4 book ai didi

c++ - 错过了虚函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 16:06:21 26 4
gpt4 key购买 nike

我在一个基类中有一个虚函数,还有几个来自该基类的派生类。在其余部分被调用时,我没有收到对虚函数的调用。

我的基类:

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::map 列表来存储基于所用数据类型的派生类指针列表。因为所有的派生类都来自基类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());
}

我得到的输出如下。我不明白真正的问题是什么,为什么它为 eANYeWSTRING 类型打印正确的值,为什么不为 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

最佳答案

由于 C_BOOL 中的方法名称错误,您得到了错误的结果:virtual EDataTypeID getDataTypeId() const 而不是 virtual EDataTypeID getDataTypeID()const。在 C++11 中,override 说明符将有助于避免此类错误。

关于c++ - 错过了虚函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34683221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com