C++ 检测继承类并将其转换为基类
我有3个类,一个是基类,其他的是从基类继承的类,下面是这些类的代码:C++ 检测继承类并将其转换为基类,c++,C++,我有3个类,一个是基类,其他的是从基类继承的类,下面是这些类的代码: // Event Class #ifndef EVENT_H #define EVENT_H #include <iostream> namespace Engine { namespace Data { // base class class Event { public: // Class
// 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 inDataEvent.push_back(&SE)代码>和数据事件。向后推(&TE)
错误是引用非常量的初始值必须是左值使用指针会给我带来很多错误,没有运算符“*”匹配这些操作数操作数类型是:*引擎::数据::事件::SampleEvent(也有TimeEvent)
以及“标识符”静态指针\u cast是未定义的`有很多错误和2 errorsTry相同,再次使用指针示例,这在我的机器上工作。哇,谢谢!成功了,顺便问一下,你知道如何检测对象是SampleEvent对象还是TimeEvent对象吗?@ChronoCross有几种不同的方法
Event E = DataEvent[0];
virtual void f(){}