我有以下示例代码:
#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/