c++构建器xe2上更不稳定的行为:DYNAMIC_CAST总是返回NULL

More erratic behavior on c++ builder xe2: DYNAMIC_CAST always returns NULL

本文关键字:DYNAMIC CAST NULL 返回 xe2 构建 不稳定 c++      更新时间:2023-10-16

由于Embarcadero,我快要放弃12年的delphi和c++ builder了。从没见过这么有问题的IDE。

这次的问题是dynamic_cast总是返回NULL。

在同一个单元中,我派生了两个类:

class TStructTreeNode: public TTreeNode
class PACKAGE TStructTreeView : public TTreeView

转换为TStructTreeView工作正常:

TStructTreeView* tv = dynamic_cast<TStructTreeView*>( AOwner->Owner );

但是转换到TStructTreeNode总是返回NULL:

TStructTreeNode* snode = dynamic_cast<TStructTreeNode*>(Items->Item[i]);

注意Items->Item[i]实际上是TStructTreeNode,因为下面的代码工作得很好:

((TStructTreeNode*)(Items->Item[i]))->ToggleChecked();

按如下方式创建节点:

TStructTreeNode* snode = new TStructTreeNode(Items,UniqueID);
TTreeNode* node = Items->AddNode(snode,Relative,S,Ptr,Method);

在同一个包中,我有另一个组件,其类TMDTreeNode和TMDTreeView以完全相同的方式派生,在该单元中所有的dynamic_cast都有效。

欢迎任何灯光

PS:虚析构函数已作为其他post添加,但不能工作。

为了用dynamic_castTTreeNode指针类型转换为TStructTreeNode指针,您必须实例化一个真正的TStructTreeNode实例来满足转换。如果使用一般的TTreeNodes方法,比如Add(),那么重写虚拟的CreateNode()方法,告诉TTreeView创建TStructTreeNode实例,而不是TTreeNode实例。例如:

class PACKAGE TStructTreeView : public TTreeView
{
protected:
    virtual TTreeNode* __fastcall CreateNode();
};
TTreeNode* __fastcall TStructTreeView::CreateNode()
{
    return new TStructTreeNode(Items);
}

将PACKAGE添加到TStructTreeNode的类定义中已经解决了这个问题

class PACKAGE TStructTreeNode: public TTreeNode

但是似乎Embarcadero工作不规律,因为在同一个包中,我有另一个单元,其中动态转换一个名为TMDTreeNode的类没有包指令也能正常工作。

class TMDTreeNode: public TTreeNode

代码:

((TStructTreeNode*)(Items->Item[i]))->ToggleChecked();

不能"证明"Items->Item[i](TStructTreeNode *),甚至不能接近。它只是解释当前指针所指向的位置的内存,就好像它是一个TStructTreeNode

如果它不是TStructTreeNode,那么行为是未定义的,这意味着它可能会成功,也可能不会成功。即使它是一个TStructTreeNode,如果Items->Item[i]的数据类型不是指向TStructTreeNode基类的指针,那么dynamic_cast<>也会失败。我希望你不会期望dynamic_cast<>将"解码"void *或其他东西。

能否显示Item的声明?