gpt4 book ai didi

c++ - 基类 -> 派生类和 C++ 中的反之转换

转载 作者:行者123 更新时间:2023-11-30 01:30:21 25 4
gpt4 key购买 nike

我有以下示例代码:

#include <iostream>
#include <string>

using namespace std;

class Event
{
public:
string type;
string source;
};

class KeyEvent : public Event
{
public:
string key;
string modifier;
};

class MouseEvent : public Event
{
public:
string button;
int x;
int y;
};

void handleEvent(KeyEvent e)
{
if(e.key == "ENTER")
cout << "Hello world! The Enter key was pressed ;)" << endl;
}

Event generateEvent()
{
KeyEvent e;
e.type = "KEYBOARD_EVENT";
e.source = "Keyboard0";
e.key = "SPACEBAR";
e.modifier = "none";

return e;
}

int main()
{
KeyEvent e = generateEvent();

return 0;
}

我无法编译它,G++ 抛出一个错误:

main.cpp: In function 'int main()':
main.cpp:47:29: error: conversion from 'Event' to non-scalar type 'KeyEvent' requested

我知道这个错误对于 C++ 大师来说是显而易见的,但我不明白为什么我不能将基类对象转换为派生对象。有人可以建议我解决我遇到的问题吗?谢谢你的建议

最佳答案

您的函数 generateEvent 执行以下操作:

  • 创建一个KeyEvent
  • 通过复制和切片将对象转换(向上转换)为事件
  • 返回事件对象

然后您尝试获取该 Event 对象拷贝并将其再次放入 KeyEvent

你试图使用多态性但实际上只是切片。考虑(谨慎!)动态分配:

boost::shared_ptr<Event> generateEvent() {
KeyEvent* e = new KeyEvent;
e->type = "KEYBOARD_EVENT";
e->source = "Keyboard0";
e->key = "SPACEBAR";
e->modifier = "none";

return boost::shared_ptr<Event>(static_cast<Event*>(e));
}

int main() {
boost::shared_ptr<Event> e = generateEvent();
// you can now use dynamic_cast and/or virtual
// function calls to treat e as a pointer-to-KeyEvent
}

另请注意,return 0; 隐含在入口函数中。

关于c++ - 基类 -> 派生类和 C++ 中的反之转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579043/

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