是否有一种方法可以将子*返回到基数*并计算返回的子*是哪个?
Is there a way to return a child* to a base* and evaluate which child* has been returned?
我试过了,但没有成功:
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_cast
:
Base* pObject = get_object(); // May return a pointer to Derived
Derived* pDerived = dynamic_cast<Derived*>(pObject);
请注意,动态向下转换有时是糟糕设计的指示符。试着想想在层次结构中更好地安排虚函数是否会有所帮助。
如果不了解具体的应用领域,我不可能给出更具体的建议。
dynamic_cast操作符在类为多态时执行特殊检查。
SOTile* pSOTile = dynamic_cast<SOTile*>(pSObject);
if (pSOTile)
{
/* Do */
}
由于SOTile
是一个指针的类型派生自SObject
,你应该不需要强制转换,因为编译器应该能够自动解析一个SObject
指针从派生的指针,然后比较两个SObject
指针在一起(同样的方式,你可以分配一个派生指针到一个基指针没有类型强制转换)。有些编译器,比如Borland的编译器,很好地支持这个,例如:
class Base
{
};
class Derived : public Base
{
};
Derived *d = ...;
Base *b = ...;
if (b == d) // <-- compiles fine
但是,如果由于某种原因编译器不允许这样做,您可以使用static_cast
手动转换派生指针(不要使用dynamic_cast
转换基指针):
if (pSObject == static_cast<SObject*>(SOTile))
如果SOTile
不是指向SObject
派生类型的指针,则static_cast
将在编译时失败。
我不建议使用dynamic_cast。相反,您可以在不同的子类中实现不同的行为。有时称为"模板方法"模式
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 始终在 C++ 计算脚本中返回466750944
- imageLoad glsl 在计算着色器 OpenGL 4.3 中始终返回 0
- 返回一个计算了参数的函数
- 计算BST返回-1的高度混淆
- 我正在尝试创建一个布尔函数,该函数计算字符并在字符为"()*-+"时返回 true
- 计算 <Classtype*> 向量中所有项的布尔值的最有效方法,如果全部为真则返回 true
- 递归计算满足条件的值数并返回该数字
- 从捕获 constexpr 函数返回值的变量中删除 constexpr 会删除编译时计算
- 我正在尝试编写一个简单的计算程序,但答案一直返回为 0
- 为什么当我尝试计算平均绝对偏差时,我的程序返回 inf
- 为什么这个计算二进制搜索树中节点的递归函数总是返回比预期更大的结果
- 计算每秒添加到队列中添加的请求数 - 始终返回为零
- CSV文件中的两条线的交点的计算返回-1.#IND
- friend get 函数,返回通过可变参数模板递归计算的类型
- 创建一个函数,该函数根据边缘转换为给定(浮点)时间值计算布尔返回值
- 如何在递归函数中计算返回结果
- 如何计算并返回指向max元素的指针的值?C++