C ++中的动态绑定?

时间:2014-06-02 14:50:52

标签: c++ dynamic-binding

我需要对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();

我的问题是:
这是正确的方法吗?这是动态绑定的一个例子吗?

感谢您的关注,如果我没有正确解释我的问题,我很抱歉,这是我在这个精彩网站上的第一篇文章!

4 个答案:

答案 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或其他东西。

要使用的算法可以在构造函数中传递。