繁体   English   中英

C ++继承和多态性中具有不同参数的函数

[英]The function with different parameters in C++ Inheritance and Polymorphism

最近,我正在学习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;
}

当然,此代码中存在编译器错误。

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

有什么好办法解决这个问题吗?

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

原型表示:

  1. 相同的返回类型
  2. 相同参数列表
  3. 如果存在于基础方法上,则原型末尾的const关键字必须存在于派生对象上
  4. 相同的方法名称

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

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

高级内容-经常不有用:

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

Base * Method();

派生的方法可以是:

Derived * Method();

这是因为派生*是基本*

希望它澄清

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

从概念上讲,发生的事情是继承表示“是”关系。 bi_dir_Node继承自Node意味着bi_dir_Node Node ,所以Node可以做的任何事情, bi_dir_Node都可以做。

您试图说bi_dir_Node是一个Node但是它不能完成Node可以做的所有事情:具体地说,它不能使用单个参数进行Connect

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM