如何在运行时获取虚函数指针的确切类型
How to get the exact type of a pointer in run time for virtual functions?
我正在使用C++虚函数。我有一个基类treeNode和两个派生的分类splitNode和leafNode。splitNodes中的一些指针指向其他节点,这些节点可能是splitNode或leafNode。在运行时,我如何检查指针是否指向叶节点或拆分节点,而不更改节点的结构(即,我不想向它们添加任何新功能)。
问候
目前尚不清楚为什么要这样做,但您可以使用dynamic_cast
:
treeNode* theNode = ....;
splitNode sNode* = dynamic_cast<splitNode*>(theNode);
bool isSplitNode = sNode != nullptr;
或者只是
bool isSplitNode = dynamic_cast<splitNode*>(theNode);
如果正确使用多态性,则不必执行此操作。
在基类中实现虚拟 GetType 方法,并在子类中重写它。这是最有效的方法。
记住开放封闭原则。您应该利用多态性。
可以使用 dynamic_cast
或 typeid 运算符来执行此操作。 但是,通常这是一个非常糟糕的主意。 如果你的虚函数需要知道对象的确切类型,那么你的设计就有问题。
如果您遇到这种情况:
class treeNode
{
virtual int foo()
{
// do some default thing, maybe nothing
}
};
class splitNode : public treeNode
{
virtual int foo()
{
// do whatever splitNode wants to do
}
};
class leafNode : public treeNode
{
virtual int foo()
{
// do whatever leafNode wants to do
}
};
并且您有一个指向splitNode
或leafNode
对象的指针treeNode *p;
,并且您调用p->foo()
,然后将调用foo()
的相应版本。 这就是虚函数的全部意义所在。
另外,请参阅此问题。
有一个枚举
成员的类型,或者一个返回子节点数的虚函数。就个人而言,对于这种事情,我只会有一个带有枚举(或叶子的空子指针)的节点类。
可以使用
typeid
运算符获取指向运行时多态对象的指针的基础类型。下面是一个适合您描述的设计的示例:
struct treeNode
{
};
struct splitNode : treeNode
{
treeNode* left;
treeNode* right;
};
struct leafNode : treeNode
{
bool disabled;
};
void traverse(splitNode* node);
void traverse(leafNode* node);
void traverse(treeNode* node)
{
if(typeid(*node) == typeid(leafNode))
{
return traverse(static_cast<leafNode*>(node));
}
return traverse(static_cast<splitNode*>(node));
}
请注意,dynamic_cast
做几乎相同的事情。
与在基类中存储某种形式的 type-id 并使用 static_cast
相比,typeid
的性能可能很差。尽管有这个警告,但它对于不是性能关键型代码(例如大多数代码)非常有用。
相关文章:
- C++中的双指针类型转换
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 将类指针类型转换为键时出错
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 指针类型类成员的动态强制转换的恒定性是什么?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- STL 函数和函数类型与函数指针类型
- 如何调用指针类型的方法(禁用多态性)?
- 为什么新表达式可以正确生成指针类型,即使它应该返回 void*?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 专门用于"direct"函数类型(与函数指针类型相对)
- 指向成员的指针类型和模板
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 在C++17中,为什么类模板和函数模板的指针类型推导明显不一致
- 为什么允许将整型、枚举和指向成员的指针类型reinterpret_cast到自身?