Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++_Object_Dynamic Cast - Fatal编程技术网

C++ 动态强制转换不';我不认识会员

C++ 动态强制转换不';我不认识会员,c++,object,dynamic-cast,C++,Object,Dynamic Cast,我正在做一个项目,我有两个班:房间和活动室 EventRoom继承自Room,并拥有更多的成员 在我的代码中,我这样做(tmpPtr是一个房间指针): 我得到编译错误。setComplete是EventRoom的成员 简短版本:我想创建类型为Room的对象,在某些情况下还可以创建EventRoom。该代码目前仅适用于Room,但90%的代码将与EventRoom相同。有没有办法使用相同的代码?(使用dynamic_cast或类似的工具)您需要tmpPtr作为EventRoot指针 EventRo

我正在做一个项目,我有两个班:房间和活动室 EventRoom继承自Room,并拥有更多的成员

在我的代码中,我这样做(tmpPtr是一个房间指针):

我得到编译错误。setComplete是EventRoom的成员


简短版本:我想创建类型为Room的对象,在某些情况下还可以创建EventRoom。该代码目前仅适用于Room,但90%的代码将与EventRoom相同。有没有办法使用相同的代码?(使用dynamic_cast或类似的工具)

您需要
tmpPtr
作为
EventRoot
指针

EventRoom* tmpPtr;

if(eventRoom)
     tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);
EventRoom*tmpPtr;
国际单项体育联合会(活动室)
tmpPtr=动态铸造(tmpPtr);

只能在
Room
指针上调用
Room
公共方法。您不能仅调用
EventRoom
-方法。

您需要
tmpPtr
作为
EventRoot
指针

EventRoom* tmpPtr;

if(eventRoom)
     tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);
EventRoom*tmpPtr;
国际单项体育联合会(活动室)
tmpPtr=动态铸造(tmpPtr);

只能在
Room
指针上调用
Room
公共方法。您不能调用
EventRoom
-only方法。

必须同时使用
Room
EventRoom
的代码(也就是说,它只能使用
Room
接口),必须通过静态键入的指针
Room*

使用
EventRoom
细节的代码必须通过静态键入的指针
EventRoom*
。因此示例代码可能如下所示:

void someFunction(Room *myRoom) {
  // doRoomStuff must be a function declared in Room.
  myRoom->doRoomStuff();

  // Try to determin if the room is an event room or not. This will
  // occur at runtime.
  EventRoom *myEventRoom = dynamic_cast<EventRoom*>(myRoom);

  if (myEventRoom) {
    // doEventRoomStuff is a function declared in EventRoom. You cannot call
    // myRoom->doEventRoomStuff even if 'myRoom' points to an object that is
    // actually an EventRoom. You must do that through a pointer of type
    // EventRoom.
    myEventRoom->doEventRoomStuff();

    // doRoomStuff2 is a function that is declared in Room. Since every 
    // EventRoom is also a room, every EventRoom can do everything that
    // rooms can do.
    myEventRoom->doRoomStuff2();
  }

  myRoom->doRoomStuff3();
}
void someFunction(房间*myRoom){
//doRoomStuff必须是在文件室中声明的函数。
myRoom->doRoomStuff();
//尝试确定该房间是否为活动室。这将
//在运行时发生。
EventRoom*myEventRoom=dynamic_cast(myRoom);
如果(我的房间){
//doEventRoomStuff是在EventRoom中声明的函数。您不能调用
//myRoom->doEventRoomStuff,即使“myRoom”指向的对象是
//实际上是一个事件室。您必须通过类型为
//活动室。
myEventRoom->doEventRoomStuff();
//doRoomStuff2是一个在文件室中声明的函数
//活动室也是一个房间,每个活动室都可以做任何事情
//房间可以。
myEventRoom->doRoomStuff2();
}
myRoom->doRoomStuff3();
}

您可以通过
EventRoom*
变量访问
Room
成员,但反之亦然。

必须同时使用
Room
EventRoom
的代码(也就是说,它只适用于
Room
接口),必须通过静态键入的
Room*
指针工作

使用
EventRoom
细节的代码必须通过静态键入的指针
EventRoom*
。因此示例代码可能如下所示:

void someFunction(Room *myRoom) {
  // doRoomStuff must be a function declared in Room.
  myRoom->doRoomStuff();

  // Try to determin if the room is an event room or not. This will
  // occur at runtime.
  EventRoom *myEventRoom = dynamic_cast<EventRoom*>(myRoom);

  if (myEventRoom) {
    // doEventRoomStuff is a function declared in EventRoom. You cannot call
    // myRoom->doEventRoomStuff even if 'myRoom' points to an object that is
    // actually an EventRoom. You must do that through a pointer of type
    // EventRoom.
    myEventRoom->doEventRoomStuff();

    // doRoomStuff2 is a function that is declared in Room. Since every 
    // EventRoom is also a room, every EventRoom can do everything that
    // rooms can do.
    myEventRoom->doRoomStuff2();
  }

  myRoom->doRoomStuff3();
}
void someFunction(房间*myRoom){
//doRoomStuff必须是在文件室中声明的函数。
myRoom->doRoomStuff();
//尝试确定该房间是否为活动室。这将
//在运行时发生。
EventRoom*myEventRoom=dynamic_cast(myRoom);
如果(我的房间){
//doEventRoomStuff是在EventRoom中声明的函数。您不能调用
//myRoom->doEventRoomStuff,即使“myRoom”指向的对象是
//实际上是一个事件室。您必须通过类型为
//活动室。
myEventRoom->doEventRoomStuff();
//doRoomStuff2是一个在文件室中声明的函数
//活动室也是一个房间,每个活动室都可以做任何事情
//房间可以。
myEventRoom->doRoomStuff2();
}
myRoom->doRoomStuff3();
}

您可以通过
EventRoom*
变量访问
Room
成员,但不能通过变量访问
Room
成员。

但这样,Room也可以使用吗?或者我需要2个不同的指针,每个场景1个?@Yoan是的,它将适用于
Room
,因为
EventRoom
是一个
Room
。@juanchopanza取决于“使用
Room
工作”的含义。不可能将
Room*
分配到
EventRoom*
(没有演员阵容).但这样做对房间也有效吗?或者我需要2个不同的指针,每个场景1个?@Yoan是的,它将适用于
Room
,因为
EventRoom
是一个
Room
。@juanchopanza取决于“使用
Room
工作”的含义。不可能将
Room*
分配到
EventRoom*
(没有演员阵容).这是一个很好的开始。我写了一些非常类似的东西,但在看到你的帖子后,我选择编辑它,为你的代码添加一些注释,以强调一些东西。这是一篇优秀的帖子。我写了一些非常类似的东西,但在看到你的帖子后,我选择编辑它,为你的代码添加一些注释,以强调一些东西。