问答
1.什么是多态
多态是面向对象编程中的一个重要概念,指的是同一个方法在不同对象上具有不同的行为。简单来说,多态是指一个对象能够根据当前所处的具体类型,来决定调用哪个类的方法。
多态可以通过继承和函数重写来实现。当一个子类继承自父类,并重写了父类的方法时,可以通过父类的引用或指针来调用子类的方法。在编译时,编译器会根据引用或指针的静态类型来确定调用哪个类的方法,而在运行时,实际调用的是对象的动态类型所对应的方法。
多态的好处是增加了代码的灵活性和可扩展性。通过多态,可以编写通用的代码,而不需要针对每个具体的子类编写特定的代码。这样可以提高代码的复用性,并且在需要新增子类时,不需要修改原有的代码,只需要添加新的子类即可。
2.什么是重载、重写(覆盖)、重定义(隐藏)?
重载(Overloading)是指在同一个类中定义多个同名的方法,但是这些方法的参数列表不同。通过重载,可以根据不同的参数类型或参数个数来调用不同的方法。重载的方法在编译时会根据调用的参数类型来确定具体调用哪个方法。
重写(Override)是指子类对父类中的方法进行重新实现。子类可以通过重写父类的方法来改变方法的实现细节,但是方法名、参数列表和返回值类型必须与父类的方法保持一致。通过重写,可以实现多态性,即在运行时根据对象的动态类型调用相应的方法。
重定义(Hide)是指子类对父类中的方法进行重新定义,即在子类中定义了与父类中同名的方法。重定义与重写的区别在于,重定义不会改变方法的继承关系,子类中的方法只是隐藏了父类中的同名方法,而不是重写了它。在编译时,根据引用的静态类型来确定调用哪个方法。
总结起来,重载是指在同一个类中定义多个同名的方法,通过参数列表的不同来区分它们;重写是指子类对父类中的方法进行重新实现,实现多态性;重定义是指子类中定义了与父类中同名的方法,隐藏了父类中的同名方法,不改变继承关系。这三个概念在面向对象编程中都是用于处理方法的不同实现方式。
二叉搜索树
BinarySerachTree.h
#pragma once
template<class K>
struct BSTreeNode //构造成结构体方便调用数据,不用写友元
//将BSTreeNode定义为结构体可以简化代码,避免了定义类时需要添加额外的访问修饰符(如public、private等)
{
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
K _key;
BSTreeNode(const K& key)
:_left(nullptr)
,_right(nullptr)
,_key(key)
{}
};
template<class K>
class BSTree
{
typedef BSTreeNode<K> Node;
public:
bool Insert(const K& key)
{
if (_root == nullptr)
{
_root = new Node(key);
return true;
}
Node* parent = nullptr;
Node* cur = _root;
while (cur)
{
if (cur->_key < key)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_key > key)
{
parent = cur;
cur = cur->_left;
}
else
{
return false;
}
}
cur = new Node(key);
if (parent->_key < key)
{
parent->_right = cur;
}
else
{
parent->_left = cur;
}
return true;
}
void InOrder() //调用接口 可以调用私人的
{
_InOrder(_root);
}
private:
Node* _root = nullptr;
void _InOrder(Node* root) //对二叉搜索树的中序遍历 输出当前键值
{
if (root == nullptr)
{
return;
}
_InOrder(root->_left);
cout << root->_key << " ";
_InOrder(root->_right);
}
};
void TestBSTree1()
{
BSTree<int> t;
int a[] = { 8,3,1,6,40,53,2,2,2 };
for (auto e : a)
{
t.Insert(e);
}
t.InOrder();
}
test.cpp
#include<iostream>
using namespace std;
#include "BinarySerachTree.h"
int main()
{
TestBSTree1();
return 0;
}
查找
bool Find(const K& key)
{
Node* parent = nullptr;
Node* cur = _root;
while (cur)
{
if (cur->_key < key)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_key > key)
{
parent = cur;
cur = cur->_left;
}
else
{
return true;
}
}
return false;
}
}
删除