将子类转换为基类?

Posted

技术标签:

【中文标题】将子类转换为基类?【英文标题】:Converting subclass to base class? 【发布时间】:2018-04-10 02:34:55 【问题描述】:

我正在解决一个问题,其中我们有一个由节点组成的二叉搜索树。节点的属性包括字符串、指向左节点的指针和指向右节点的指针。我有一个名为 TransactionNode 的类,它是节点的子类。 TransactionNode 具有一个 int(用于销售数量)以及来自节点类的相同属性。我有一个名为 findBiggest 的函数,它查找从 TransactionNode 售出的最高金额并返回对该 TransactionNode 的引用。我的问题是如何将节点类中的内容转换为 TransactionNode? (我避免将二叉搜索树中的节点更改为 TransactionNodes)

TransactionNode & BST::findBiggest()

    TransactionNode * rightSide;
    rightSide = this->mpRoot;

    while (rightSide != nullptr)
        ``
           //find biggest transaction
        

     return rightSide;

   

【问题讨论】:

【参考方案1】:

一般来说,如果需要检查基类指针指向的对象是否属于派生类类型,则使用dynamic_cast

在您的情况下,您可以在 while 循环中尝试:

TransactionNode* txnNode = dynamic_cast<TransactionNode*>(rightSide);
if (txnNode != nullptr)

     int amtSold = txnNode->GetAmountSold();


您也可以考虑在基类中使用虚方法并依赖多态性。通常这是一种优于 dynamic_cast 的首选方式。但是,可能是您的 Node 类级别太高,不需要支持“GetAmountSold()”方法,但这是您可以决定的。

【讨论】:

以上是关于将子类转换为基类?的主要内容,如果未能解决你的问题,请参考以下文章

将派生类转换为基类

无法将参数 1 从派生指针转换为基类指针引用

将派生类转换为基类

将指针从派生类转换为基类的最佳方法

C#通过反射将派生类转换为基类异常

C ++:将void *转换为基类指针时访问冲突