从父类调用继承的函数

Calling Inherited Functions from Parent Class

本文关键字:函数 继承 调用 父类      更新时间:2023-10-16

我有一个链表类(List),它只处理Node类型的对象。它可以对这些节点做各种事情,假设它们正确地重载了布尔比较。问题是,我想将这个 List 类与一种称为术语(具有系数和指数或度数的代数项)的特殊节点一起使用。如何告诉我的 List 类使用术语函数(术语具有特殊版本的 Print() 函数和比较运算符),即使它使用 Node 指针处理术语?例如,我的 Print() 是这样的:

Node* walker=head;
while(walker)
{
     walker->Print();
     walker=walker->next;
}
除了没有 Node::P rint(

),我希望它调用 Term::P rint()!我是否必须创建一个全新的列表类来处理术语类对象?

这是多态性的典型例子。你可以像 WhozCraig 建议的那样在 Node 类中添加一个函数 Print()。(请阅读C++中的虚函数和抽象类。你可以使 Print() 成为一个虚函数。您可以决定是否要使 Print() 成为纯虚函数。如果它是一个纯虚函数,它将在基类中像这样声明。

class Node{
  virtual void Print() = 0;
  // If you don't want this to be pure virtual 
  // You can give a generic definition
}

在这种情况下,由于您没有在基类中定义 Print(),因此每个不是抽象的派生类都必须实现此方法。因此,Term 类可以从 Node 类派生,并相应地实现它的 Print() 方法:)您可以使用基类指针来调用此函数。如果将来您决定对 Node 进行子类化并添加不同的 Print() 实现,则根本不需要更改 Node:)

希望这有帮助!

你已经偏离了通常的列表设计 - 建议使用模板而不是从类派生Node。 然后,您需要一个foreach方法,该方法将在每个节点上执行操作,在本例中为 print 。 强烈建议使用 C++ 标准库容器,而不是对所有这些"原始"进行编码。

另一种选择(不太标准且存在设计缺陷)是派生一个将调用 Print 函数的PrintList,并且需要对其进行模板化或根据Term节点完成,因为编译器将期望此函数。

三个选择:-

在现实世界中,您将使用 std::list 或类似的容器类

或者,您可以将 Print() 作为虚拟方法添加到 Node(并使其抽象,可能)

class Node {
  ...
  virtual void Print() = 0;
}

或者,您可以使用将节点*转换为术语*

    Term *t = boost::polymorphic_cast<Term*>(walker);
    t->Print();