就3那一部分,能不能简单点解释一下。注,我只学过c语言
发布网友
发布时间:2022-04-15 01:55
我来回答
共2个回答
热心网友
时间:2022-04-15 03:24
比如说, 在 c 里面, 你要实现一个链表的搜索, 树的搜索, 你不会都写在 main () 函数里面实现所有功能, 你会分层次实现这些功能, 比如
NODE * seekTable ( int key, NODE * tableHead );
NODE * seekTree ( int key, NODE * root );
int main ()
{
.....
NODE * p, * th, * r;
th = initTable ( n, array );
if ( NULL == th ) return -1;
r = initTree (n);
addTreeNode ( r, key,....);
.....
p = seekTable ( myKey, th );
......
p = seekTree ( myKey, r );
.....
}
而在 c++ 里面, 你可以进一步抽象, 你发现无论 tree, table 都可以 seek, 这样你定义一个抽象类 base, 定义它的虚函数 base::seek, 然后定义tree, table 继承 base , 并重载 seek () 这一函数(或者称为 method, 方法)
class base { int key; ..... NODE * seek ( int key ) = 0; };
class tree : public base { ... };
clase table : public base { .... };
NODE * tree::seek ( int key ) { ..... // 这里是你对树查找的代码 };
NODE * table::seek ( int key ) { ..... // 这里是你对链表查找的代码 };
这样有什么好处呢?
你可以定义一个指针
base * p;
tree *ptree = new tree ( n );
p = ptree;
或者
table * pt = new table ( n );
p = pt;
.....
然后你调用 p->seek ( x );......
它就会根据 p 指向的是一个 tree, 还是 table, 来调用相应的 seek () 函数....
是不是有些事情就更方便一些了呢?
比如说你写一个函数, 不关心数据存储是用 tree 还是 table, 你只需要找到 key == x 的节点就行
那么这个函数, 就可以只写一份......如果你修改这个函数, 修正某些 bug, 或者让它更高效, 或者改变不同的输出格式, 那现在你只需要改一次......否则, 例如在传统 c 代码中, 你可能需要分别对 tree, table 各修改一次, 你确信你不会改错其中的一个, 或者忘了修改其中的一个?
一个典型的例子是, 当你有一堆有序的, 不同数据类型的链表, 在 c 里面你需要为每个数据类型写一个排序函数, 比如说冒泡吧; 在 c++ 里面, 你只需要为他们的共同的基类 base 写一个排序函数, (当然它们肯定有个比较大小的算符或者函数, 你可以在 base 里面声明虚函数, 然后在各数据类型中重载它)........
热心网友
时间:2022-04-15 04:42
大哥,再好的眼睛也会看废掉的,可以是有字的吗?追问呵呵,不好意思,太多了不知道提取哪部分打出来