Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;和演员操作员 我有一个关于C++演员的问题。_C++_Casting_Polymorphism_Static Cast - Fatal编程技术网

C++;和演员操作员 我有一个关于C++演员的问题。

C++;和演员操作员 我有一个关于C++演员的问题。,c++,casting,polymorphism,static-cast,C++,Casting,Polymorphism,Static Cast,假设您有一个类Message和几个子类:Message1message2等等 假设您有一个类Event,还有不同的事件子类:Event 1Event 2 在这两种情况下,我都可以从ID(例如字段)中区分子类的类型 我将实例Event1或Event2插入向量 在这种情况下,当我提取承运人的事件时,尽管我确信您有一个Event1的实例,但使用静态\u cast?例如: Event theEvent = myVector.at(i); Event1 *e1 = static_cast&

假设您有一个类
Message
和几个子类:
Message1
message2
等等

假设您有一个类
Event
,还有不同的事件子类:
Event 1
Event 2

在这两种情况下,我都可以从
ID
(例如字段)中区分子类的类型

我将实例Event1或Event2插入
向量
在这种情况下,当我提取承运人的事件时,尽管我确信您有一个Event1的实例,但使用
静态\u cast
?例如:

    Event theEvent = myVector.at(i);
    Event1 *e1 = static_cast<Event1*>(&theEvent);
    if(e1->getID() == xxx) {
    Message2 *m2 = static_cast<Message2*>(&e1->getMessage());
    }
Event theEvent=myVector.at(i);
事件1*e1=静态施法(&theEvent);
如果(e1->getID()==xxx){
Message2*m2=static_cast(&e1->getMessage());
}
我有一个问题:在最后一次强制转换之后,我没有将实例信息视为Message2(总是只看到其父类Message的信息) 在这种情况下,是否需要使用动态强制转换?

e1->getMessage()
返回Message类型的对象,而不是指针。因此,您的数据将被切片。此外,您还可以在此处将指针强制转换为临时值:

Message2 *m2 = static_cast<Message2*>(&e1->getMessage());
static\u cast
是将基指针强制转换为派生指针的正确方法,而无需任何运行时检查。这样做的“更安全”方法当然是使用dynamic\u cast操作符,因为它会在将派生指针或引用强制转换为基指针或引用时执行运行时检查。(我想如果我告诉你如果你有自己的防故障检查工具,就要坚持使用
静态\u cast
来避免这些检查,我会被石头砸死的。)

在我看来,最好的方法是在基类中进行适当的虚拟接口设计。您可以避免以这种方式从基础到派生进行强制转换

此外,如果使用
向量
,则对所有
事件
进行切片。只能使用
vector
来收集派生对象,因为基指针可能指向派生对象,但基对象不能保存派生数据。(向量中所有派生的
事件
都将错过
消息
,并且只有
事件
中包含的数据)

e1->getMessage()
返回消息类型的对象,而不是指针。因此,您的数据将被切片。此外,您还可以在此处将指针强制转换为临时值:

Message2 *m2 = static_cast<Message2*>(&e1->getMessage());
static\u cast
是将基指针强制转换为派生指针的正确方法,而无需任何运行时检查。这样做的“更安全”方法当然是使用dynamic\u cast操作符,因为它会在将派生指针或引用强制转换为基指针或引用时执行运行时检查。(我想如果我告诉你如果你有自己的防故障检查工具,就要坚持使用
静态\u cast
来避免这些检查,我会被石头砸死的。)

在我看来,最好的方法是在基类中进行适当的虚拟接口设计。您可以避免以这种方式从基础到派生进行强制转换


此外,如果使用
向量
,则对所有
事件
进行切片。只能使用
vector
来收集派生对象,因为基指针可能指向派生对象,但基对象不能保存派生数据。(向量中所有派生的
事件
都将丢失
消息
,并且只有
事件
中包含的数据)

通常,当您有派生类时,应该使用虚拟函数

在您的示例中,消息中的“内容”可能可以通过虚拟函数获得

该演员阵容:

    Event1 *e1 = static_cast<Event1*>(&theEvent);
Event1*e1=static\u cast(&theEvent);
这是行不通的<代码>事件比
事件1
小一个
消息
——这意味着你从中得到的任何消息都将是“随机垃圾”,因为你一开始只有一个
事件


如果要在事件数组中存储“任何类型的事件”,则需要存储指向
事件
类型的指针,否则肯定会遇到上述切片问题。

通常,当您有派生类时,应该使用虚拟函数

在您的示例中,消息中的“内容”可能可以通过虚拟函数获得

该演员阵容:

    Event1 *e1 = static_cast<Event1*>(&theEvent);
Event1*e1=static\u cast(&theEvent);
这是行不通的<代码>事件
事件1
小一个
消息
——这意味着你从中得到的任何消息都将是“随机垃圾”,因为你一开始只有一个
事件


如果您想在事件数组中存储“任何类型的事件”,那么您需要存储指向
事件
类型的指针,否则您肯定会遇到上述切片问题。

您提出的想法完全没有希望。在结构和向量中按值存储所有基类。这意味着它们将完全是基类类型,而不是任何派生类。因此,铸造将不会帮助你一点

您必须仔细阅读如何在集合或结构中存储多态对象。(基本上是通过某种指针,正确地安排所有权问题)


解决了存储问题后,您可以回来选一个角色——相比之下,这将很容易。

您提出的想法完全没有希望。在结构和向量中按值存储所有基类。这意味着它们将完全是基类类型,而不是任何派生类。因此,铸造将不会帮助你一点

您必须仔细阅读如何在集合或结构中存储多态对象。(基本上是通过某种指针,正确地安排所有权问题)


解决存储问题后,您可以返回进行强制转换——相比之下,这将很容易。

如果向量只包含