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

标签 c++ casting derived-class base-class

我有以下示例代码:

#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/

相关文章:

c++ - 从方法返回内部类时出错(C++)

derived-class - 使用 boost.serialization 序列化 Eigen 矩阵

php - 转换变量来编写 CSS

将字符串转换为 float

c - 防止 C 中不兼容的函数转换?

c++ - 为什么这个编译成功?

c++ - 在 C++ 模板生成的类层次结构中按参数类型匹配类

c++ - 错误 "IRE!"在 GDB 中意味着什么?

C++ 使用 'new' 分配延迟内存分配

C++ unique_ptr 和映射