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:好的,很抱歉我回答得不够快: