[英]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所说,要具有多态性,您需要在派生类中具有具有相同原型的函数。
原型表示:
这是因为无论是基础对象还是派生对象,所有函数都必须以相同的方式和语义来调用。
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_Node
和bi_dir_Node
完全分开(不属于同一继承层次结构),并编写通用的模板类和模板函数以对二者进行操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.