从父类调用继承的函数
Calling Inherited Functions from Parent Class
我有一个链表类(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();
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承