Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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++_Oop_Class_Pointers_Inheritance - Fatal编程技术网

C++ 是否有方法将子项*返回到基*并评估已返回的子项*?

C++ 是否有方法将子项*返回到基*并评估已返回的子项*?,c++,oop,class,pointers,inheritance,C++,Oop,Class,Pointers,Inheritance,我尝试了这个,但没有成功: void Map::OnLMClick(short xPos, short yPos) { SObject* pSObject = pEditWindow->GetSelectedItem(); if (pSObject==SOTile) { /* Do */ 我试着以此作为测试: SObject* EditorWindow::GetSelectedItem() { return pSOTile[1]; //pS

我尝试了这个,但没有成功:

void Map::OnLMClick(short xPos, short yPos)
{
    SObject* pSObject = pEditWindow->GetSelectedItem();

    if (pSObject==SOTile)
    {
       /* Do */
我试着以此作为测试:

SObject* EditorWindow::GetSelectedItem()
{
    return pSOTile[1]; //pSOTile[1] is a valid pointer, member of EditorWindow
}

SOTile类是基类SObject的子类。那么,有没有可能创建一个Base*来返回它的一个子项*,然后让程序根据返回的子项做出不同的反应?如果是这种情况,那么我如何访问不是base成员的子级成员?

如果您的类型是多态的,即如果它们至少有一个虚拟函数,则可以使用dynamic\u cast:

请注意,动态降级有时是糟糕设计的指标。试着想想,在您的层次结构中更好地安排虚拟功能是否会有所帮助


在不了解具体应用领域的情况下,我无法给出更多具体建议。

如果您的类型是多态的,即如果它们至少有一个虚拟函数,则可以使用dynamic\u cast:

请注意,动态降级有时是糟糕设计的指标。试着想想,在您的层次结构中更好地安排虚拟功能是否会有所帮助

如果不知道具体的应用领域,我就不可能给出更多具体的建议。

当类是多模态的时,执行特殊检查

   SOTile* pSOTile = dynamic_cast<SOTile*>(pSObject);
   if (pSOTile)
   {
      /* Do */
   } 
当类为多态时执行特殊检查

   SOTile* pSOTile = dynamic_cast<SOTile*>(pSObject);
   if (pSOTile)
   {
      /* Do */
   } 

我不建议使用dynamic_cast。相反,您可以在不同的子类中实现不同的行为。有时被称为d模式

我不建议使用动态投影。相反,您可以在不同的子类中实现不同的行为。有时称为d模式

,因为SOTile是指向从SObject派生的类型的指针,所以您根本不需要强制转换,因为编译器应该能够自动从派生指针解析SObject指针,然后将两个SObject指针比较在一起,就像您可以将派生指针分配给基指针而无需类型转换一样。一些编译器,如Borland的,很好地支持这一点,例如:

class Base
{
};

class Derived : public Base
{
};

Derived *d = ...;
Base *b = ...;

if (b == d) // <-- compiles fine
如果SOTile不是指向从SObject派生的类型的指针,则静态强制转换将在编译时失败。

由于SOTile是指向从SObject派生的类型的指针,因此您根本不需要强制转换,因为编译器应该能够自动从派生指针解析SObject指针,然后将两个SObject指针比较在一起,就像您可以将派生指针分配给基指针而无需类型转换一样。一些编译器,如Borland的,很好地支持这一点,例如:

class Base
{
};

class Derived : public Base
{
};

Derived *d = ...;
Base *b = ...;

if (b == d) // <-- compiles fine

如果SOTile不是指向从SObject派生的类型的指针,静态强制转换将在编译时失败。

@Mickaelbergernonéron:很高兴它有帮助:我正在创建一个地图编辑器。在某些情况下,我希望通过单击地图,将一个图块更改为另一个图块。在其他时候,我会想提高或降低高度,或者在我的瓷砖上添加对象。对象是在单击地图之前选择的可选对象。如果SObject实际上是一个SOTile,那么在地图上单击不会做与SObject是(比如)要添加到瓷砖上的装饰相同的事情。那么,有了这些信息,你能帮我更多吗?算了吧,我刚刚找到了一个解决办法。毕竟,这比我想象的要简单得多。无论如何,谢谢。@Mickelbergeronéron:好的,很抱歉我回答得不够快:@Mickelbergeronéron:很高兴这有帮助:我正在创建一个地图编辑器。在某些情况下,我希望通过单击地图,将一个图块更改为另一个图块。在其他时候,我会想提高或降低高度,或者在我的瓷砖上添加对象。对象是在单击地图之前选择的可选对象。如果SObject实际上是一个SOTile,那么在地图上单击不会做与SObject是(比如)要添加到瓷砖上的装饰相同的事情。那么,有了这些信息,你能帮我更多吗?算了吧,我刚刚找到了一个解决办法。毕竟,这比我想象的要简单得多。不管怎样,谢谢。@Mickeelbergronéron:好的,很抱歉我回答得不够快: