我需要对C ++中的动态绑定做一些澄清
我解释了我的问题
我必须使用二叉搜索树来实现字典。我决定也实现一个AVL树(自我二元搜索树)。我已成功实现了两个类:BST(二叉搜索树)和扩展BST的AVL。我的程序工作正常
我的目标是只有一个指针,我可以从BST类切换到类AVL,向用户询问“你想使用哪种结构?”在节目开始时。
其余的代码是相同的,因为BST和AVL具有相同的方法名称(即使它们执行不同的操作 - >覆盖)。
我通过这种方式实现了目标:
cout << "whitch structure would you like to use? [1] for BST, [2] for AVL";
short choise;
cin >> choise;
BST a;
AVL b;
BST* dictionary;
if (choise == 1)
dictionary = &a;
else if (choise == 2)
dictionary = &b;
.
.
.
dictionary->doSomething();
我的问题是:
这是正确的方法吗?这是动态绑定的一个例子吗?
感谢您的关注,如果我没有正确解释我的问题,我很抱歉,这是我在这个精彩网站上的第一篇文章!
答案 0 :(得分:5)
这是动态绑定的一个例子吗?
假设AVL
派生BST
,那么是。
这是正确的方法吗?
假设AVL
派生BST
,那么是。
这是最好的方式吗?好吧,也许不是。你总是在实例化两种种树,即使只使用过一种树。这似乎很浪费。
更常见的方法是实际有条件地构建它们:
std::unique_ptr<BST> dictionary;
if (choise == 1)
dictionary.reset(new BST());
else if (choise == 2)
dictionary.reset(new AVL());
// ...
assert(dictionary.get());
dictionary->doSomething();
除非你对动态分配过敏,或者你的系统上没有堆,或者你在某个地方的超紧密循环中做这些事情,这种方法更为传统。
但最终,它几乎是一回事。
答案 1 :(得分:0)
如果AVL
类公开继承自BST
类,那么,是的,这是正确的。
答案 2 :(得分:0)
这是多态性的一个例子,动态绑定是运行时多态的表达。
由于AVL 是-A BST,您绝对应该让AVL公开继承自BST。 然后是的,你的应用程序将能够以多态方式处理这两种类型。
答案 3 :(得分:0)
另一种方法可能是将平衡算法与一般BST数据结构分开。例如,你可以使用AVL或RBT或其他东西。
要使用的算法可以在构造函数中传递。