gpt4 book ai didi

c++ - 如何从基类转换为派生类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:01 24 4
gpt4 key购买 nike

我想制作一个多线程模型,其中服务器主循环不会因挂起的数据库事务而停止。所以我做了几个简单的类,这是一个非常简化的版本:

enum Type
{
QueryType_FindUser = 1 << 0,
QueryType_RegisterUser = 1 << 1,
QueryType_UpdateUser = 1 << 2,
//lots lots and lots of more types
};

class Base
{
public:
Type type;
};
class User: public Base
{
public:
std::string username;
User(std::string username)
:username(username)
{type = QueryType_FindUser;}
};

现在,当我将数据作为 Base 传输时,我想再次将其转换回 User 类:

concurrency::concurrent_queue<QueryInformation::Base> BackgroundQueryQueue;
void BackgroundQueryWorker::Worker()
{
while(ServerRunning)
{
QueryInformation::Base Temp;
if(BackgroundQueryQueue.try_pop(Temp))
{
switch(Temp.type)
{
case QueryInformation::Type::QueryType_FindUser:
{
QueryInformation::User ToFind(static_cast<QueryInformation::User>(Temp));//error here
//do sql query with user information
break;
}
//etc
}
}
boost::this_thread::sleep(boost::posix_time::milliseconds(SleepTime));
}
}

在我标记//errorhere 行的地方,它说没有从BaseUser 的用户定义转换,我应该怎么办做?如何定义此转换?

我是多态性的新手,所以额外解释一下为什么它不能编译也很好 :)根据我对多态性的理解,应该可以在 base<->derived..

之间自由转换

最佳答案

您只能通过使用指针引用 来使用多态性,而不能直接使用值。

因此,你应该使用:

QueryInformation::User * user = static_cast<QueryInformation::User *>(&Temp);

并相应地修改您的代码以使用指针而不是直接值。

此外,您分配 Temp 的方式确实属于 Base 类,而不属于 User 类,因此它的“类型”将不是QueryType_FindUser,则不会执行static_cast(您不会输入case值)。

通过 static_cast 正常使用多态应该是这样的:

QueryInformation::Base * temp = new QueryInformation::User; 
// or obtain by some other methods, so that you don't know the exact
// type, but anyway you *must* use a pointer (or reference).

switch(temp->type)
{
case QueryInformation::Type::QueryType_FindUser:
{
QueryInformation::User * user = static_cast<QueryInformation::User*>(temp);
}
}

在您的情况下,这意味着不是:

concurrency::concurrent_queue<QueryInformation::Base> BackgroundQueryQueue;

你应该有(注意指针):

concurrency::concurrent_queue<QueryInformation::Base *> BackgroundQueryQueue;

而且正如 Mats 所建议的,调用 Base 的虚方法可能会更好,它会自动进行调度,而不是自己创建一个 switch 并手动进行一个 static_cast

关于c++ - 如何从基类转换为派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17485380/

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