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;
}
当然这段代码有编译错误。
我的问题是,函数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_Node
是Node
,但它不能做Node
能做的一切:具体来说,它不能用一个参数Connect
。
解决方案是为bi_dir_Node
提供一个单参数Connect
,或者删除或重新设计继承结构。例如,在c++中,模板可能是一种更好的方法:您可以使uni_dir_Node
和bi_dir_Node
完全分离(不属于相同继承层次结构的一部分),并编写足够通用的模板类和模板函数,以对两者进行操作。
正如nwp所说,要具有多态性,您需要在派生类中具有相同原型的函数。
对于原型,它的意思是:
- 相同返回类型
- 相同参数列表
- 原型末尾的const关键字如果在基方法 中出现,则必须出现在派生方法中。
- 相同的方法名称当然
这是因为所有函数都需要以相同的方式和相同的语义调用,无论它是基对象还是派生对象。
virtual
关键字必须放在基类方法原型上。virtual
行为被继承。因此,它可以放在或不放在派生类重写的方法上。
高级内容-不常用:
从c++ 98(史前!)开始,如果基类方法是
Base * Method();
派生方法可以是:
Derived * Method();
这是因为派生的*是一种基*
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承