C++ 动态强制转换不';我不认识会员
我正在做一个项目,我有两个班:房间和活动室 EventRoom继承自Room,并拥有更多的成员 在我的代码中,我这样做(tmpPtr是一个房间指针): 我得到编译错误。setComplete是EventRoom的成员C++ 动态强制转换不';我不认识会员,c++,object,dynamic-cast,C++,Object,Dynamic Cast,我正在做一个项目,我有两个班:房间和活动室 EventRoom继承自Room,并拥有更多的成员 在我的代码中,我这样做(tmpPtr是一个房间指针): 我得到编译错误。setComplete是EventRoom的成员 简短版本:我想创建类型为Room的对象,在某些情况下还可以创建EventRoom。该代码目前仅适用于Room,但90%的代码将与EventRoom相同。有没有办法使用相同的代码?(使用dynamic_cast或类似的工具)您需要tmpPtr作为EventRoot指针 EventRo
简短版本:我想创建类型为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*
(没有演员阵容).这是一个很好的开始。我写了一些非常类似的东西,但在看到你的帖子后,我选择编辑它,为你的代码添加一些注释,以强调一些东西。这是一篇优秀的帖子。我写了一些非常类似的东西,但在看到你的帖子后,我选择编辑它,为你的代码添加一些注释,以强调一些东西。