C++ 检测继承类并将其转换为基类

C++ 检测继承类并将其转换为基类,c++,C++,我有3个类,一个是基类,其他的是从基类继承的类,下面是这些类的代码: // Event Class #ifndef EVENT_H #define EVENT_H #include <iostream> namespace Engine { namespace Data { // base class class Event { public: // Class

我有3个类,一个是基类,其他的是从基类继承的类,下面是这些类的代码:

// Event Class
#ifndef EVENT_H
#define EVENT_H

#include <iostream>

namespace Engine
{
    namespace Data
    {
        // base class
        class Event
        {
            public:
                // Class Variable
                int Measure;
                int Beat;
                int Position;

                // This Class that was I mean
                class SampleEvent;
                class TimeEvent;

                // Constructor
                Event(int measure, int beat, int pos);
        };

        // Sample Event Class (inherit to Event Class)
        class Event::SampleEvent : public Event
        {
            public:
            // variable in SampleEvent Class
            int ID;
            float Pan;
            float Vol;

            // Constructor
            SampleEvent(int id, float pan, float vol, int measure, int beat, int pos);
        };

        // Time Event Class (inherit to Event class)
        class Event::TimeEvent : public Event
        {
            public:
            // variable in TimeEvent Class
            double Value;

            // Constructor
            TimeEvent(double value, int measure, int beat, int pos);
        };

        // Constructor of Event
        Event::Event(int measure, int beat, int pos)
        {
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }

        // Constructor of Sample Event
        Event::SampleEvent::SampleEvent(int id, float pan, float vol, int measure, int beat, int pos) : Event(measure, beat, pos)
        {
            ID                      = id;
            Pan                     = pan;
            Vol                     = vol;
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }

        // Constructor of Time Event
        Event::TimeEvent::TimeEvent(double value, int measure, int beat, int pos) : Event(measure, beat, pos)
        {
            Value                   = value;
            Measure         = measure;
            Beat            = beat;
            Position        = pos;
        }
    }      
}
#endif

我相信你需要把它扔回去。因为虽然您可以隐式地将SampleEvent和TimeEvent强制转换为事件,但您不能以另一种方式隐式转换

您将需要使用事件引用或事件指针,以使其在强制转换中正常工作

使用参考资料 使用指针
Event::SampleEvent SE=Event::SampleEvent(1000,0,0,10,10,10);
Event::TimeEvent TE=Event::TimeEvent(200,20,20,20);
向量数据事件;
//插入事件
DataEvent.push_-back(&SE);
数据事件。推回(&TE);
//请注意,如果您不正确地强制转换,这可能会引发异常。
Event::SampleEvent*RSE=(Event::SampleEvent*)数据事件[0];
Event::TimeEvent*RTE=(Event::TimeEvent*)数据事件[1];
///这也适用于使用静态_cast
//事件::SampleEvent*RSE=静态_转换(DataEvent[0]);
//事件::TimeEvent*RTE=静态广播(DataEvent[1]);

std::cout ID我相信你需要投下它才能找回它。因为虽然您可以隐式地将SampleEvent和TimeEvent强制转换为事件,但您不能以另一种方式隐式转换

您将需要使用事件引用或事件指针,以使其在强制转换中正常工作

使用参考资料 使用指针
Event::SampleEvent SE=Event::SampleEvent(1000,0,0,10,10,10);
Event::TimeEvent TE=Event::TimeEvent(200,20,20,20);
向量数据事件;
//插入事件
DataEvent.push_-back(&SE);
数据事件。推回(&TE);
//请注意,如果您不正确地强制转换,这可能会引发异常。
Event::SampleEvent*RSE=(Event::SampleEvent*)数据事件[0];
Event::TimeEvent*RTE=(Event::TimeEvent*)数据事件[1];
///这也适用于使用静态_cast
//事件::SampleEvent*RSE=静态_转换(DataEvent[0]);
//事件::TimeEvent*RTE=静态广播(DataEvent[1]);
你有一个向量吗

vector<Event> DataEvent;
如果键入
Event::SampleEvent RSE=DataEvent[0]那么您不是在使用基类指针指向子类,而是简单地强制转换对象。如果您希望此转换成功,则必须提供转换运算符,或者考虑使用指针向量:
vector-DataEvent
然后,如果您想要获取特定事件,您可以使用
dynamic_cast
,这将允许您动态获取子类的对象,前提是它实际上是这个子类对象:请记住,在公共基类下的向量中可以有许多不同的子类 此外,您还需要一些虚拟方法,否则类型不会被视为多态的,您不能使用
动态\u cast
。这就足够了

virtual void f(){}
对于事件类

您有一个向量

vector<Event> DataEvent;
如果键入
Event::SampleEvent RSE=DataEvent[0]那么您不是在使用基类指针指向子类,而是简单地强制转换对象。如果您希望此转换成功,则必须提供转换运算符,或者考虑使用指针向量:
vector-DataEvent
然后,如果您想要获取特定事件,您可以使用
dynamic_cast
,这将允许您动态获取子类的对象,前提是它实际上是这个子类对象:请记住,在公共基类下的向量中可以有许多不同的子类 此外,您还需要一些虚拟方法,否则类型不会被视为多态的,您不能使用
动态\u cast
。这就足够了

virtual void f(){}


对于事件类

来说,不可能将子类对象itsef强制转换为基类对象,而是可以轻松地将指向子类对象的引用(如指针)强制转换为基类的引用

不可能将子类对象itsef强制转换为基类对象,但是可以将指向子类对象的引用(如指针)轻松转换为基类的引用

查看typeid运算符或查看typeid运算符@我已更改为vector DataEvent,但无法调用dynamic_cast,代码:
Event::SampleEvent RSE=dynamic_cast(DataEvent[0])DataEvent[0]
error:
运行时动态\u cast的操作数必须具有多态类类型
@@@ChronoCross是的,这是因为您需要一些虚拟methid,否则类型通常不被视为多态类,您应该尝试在基类中使用虚拟函数来开发公共接口,而不是强制转换为派生类型并单独使用它们。@@I已更改为vector DataEvent,但无法调用dynamic_cast,代码:
Event::SampleEvent RSE=dynamic_cast(DataEvent[0])DataEvent[0]
error:
运行时动态\u cast的操作数必须具有多态类类型
@@@ChronoCross是的,这是因为您需要一些虚拟methid,否则类型通常不被视为多态类,您应该尝试在基类中使用虚拟函数来开发公共接口,而不是强制转换到派生类型并单独使用它们。一分钟后,它仍然会得到错误,使用引用:It error in
DataEvent.push_back(&SE)
数据事件。向后推(&TE)
错误是
引用非常量的初始值必须是左值
使用指针会给我带来很多错误,
没有运算符“*”匹配这些操作数操作数类型是:*引擎::数据::事件::SampleEvent(也有TimeEvent)
以及“标识符”静态指针\u cast是未定义的`有很多错误和2 errorsTry相同,再次使用指针示例,这在我的机器上工作。哇,谢谢!成功了,顺便问一下,你知道如何检测对象是SampleEvent对象还是TimeEvent对象吗?@ChronoCross有几种不同的方法
Event E = DataEvent[0];
virtual void f(){}