c++中具有不同参数的函数继承与多态

The function with different parameters in C++ Inheritance and Polymorphism

本文关键字:函数 继承 多态 参数 c++      更新时间:2023-10-16

最近,我正在学习c++中的继承和多态性。

我创建了三个类:Node、uni_dir_Node(单向节点)和bi_dir_Node(双向节点)。

下面是我的代码:
class Node {
   protected:
       string name;
       Node* next;
       virtual void connect(Node* _Node) = 0;
};
class uni_dir_Node : public Node {
    void connect(Node* _Node) {
        this->next = next;
    }
};
class bi_dir_Node : public Node {
    Node* previous;
    void connect(Node* next_Node, Node* previous_Node) {
        this->next = next;
        this->previous = previous_Node;
    }
};
int main()
{
    Node* head = new bi_dir_Node;
    return 0;
}

当然这段代码有编译错误。

我的问题是,函数connect()在类uni_dir_Node有一个参数,但函数connect()在类bi_dir_Node有两个参数。如何保持这种继承结构并使其合法?

有解决这个问题的好方法吗?

正如其他人所说,问题是bi_dir_Node没有void connect(Node* _Node)方法。

从概念上讲,继承表明了一个"是一个"关系。说bi_dir_Node继承自Node意味着bi_dir_Node 是一个 Node,所以Node能做的任何事情,bi_dir_Node也能做。

你想说bi_dir_NodeNode,但它不能做Node能做的一切:具体来说,它不能用一个参数Connect

解决方案是为bi_dir_Node提供一个单参数Connect,或者删除或重新设计继承结构。例如,在c++中,模板可能是一种更好的方法:您可以使uni_dir_Nodebi_dir_Node完全分离(不属于相同继承层次结构的一部分),并编写足够通用的模板类和模板函数,以对两者进行操作。

正如nwp所说,要具有多态性,您需要在派生类中具有相同原型的函数。

对于原型,它的意思是:

  1. 相同返回类型
  2. 相同参数列表
  3. 原型末尾的const关键字如果在基方法
  4. 中出现,则必须出现在派生方法中。
  5. 相同的方法名称当然

这是因为所有函数都需要以相同的方式和相同的语义调用,无论它是基对象还是派生对象。

virtual关键字必须放在基类方法原型上。
virtual行为被继承。因此,它可以放在或不放在派生类重写的方法上。

高级内容-不常用:

从c++ 98(史前!)开始,如果基类方法是

Base * Method();

派生方法可以是:

Derived * Method();

这是因为派生的*是一种基*