如何在运行时获取虚函数指针的确切类型

How to get the exact type of a pointer in run time for virtual functions?

本文关键字:指针 类型 函数 运行时 获取      更新时间:2023-10-16

我正在使用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
  }
};

并且您有一个指向splitNodeleafNode对象的指针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 的性能可能很差。尽管有这个警告,但它对于不是性能关键型代码(例如大多数代码)非常有用。

相关文章: