分类: LINUX
2009-01-07 22:55:50
1 c/c++
1.1 谈谈你对多态的理解。
多态,字面意思就是多种形态,也就是说同一个方法在基类和派生类中的行为是不同的。
在C++中,用虚拟函数来实现多态这个特性,关键字是virtual。如果没有使用关键字virtual,程序将根据指针类型或引用类型来选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。
从编译器的角度来说,多态是怎么实现的呢?
将代码中的函数调用解释为执行特定的函数代码块成为函数名联编。
对于非虚拟函数,编译器采用静态联编。静态联编效率高,但是不能解决虚拟函数的问题。
对于虚拟函数,编译器采用动态联编。具体方法是给每个对象增加一个隐藏成员,可以理解为是一个指针,该指针指向了虚拟函数表,虚拟函数表中存储了虚拟函数的地址。当派生类提供了虚拟函数的新的定义,则虚拟函数表将保存新函数的地址,如果派生类没有提供虚拟函数的新定义,则虚拟函数表将保存原始函数的地址。调用虚拟函数时,通过隐藏的指针来查找虚拟函数表,如果要调用的是类声明中的第一个虚拟函数,则将用虚拟函数表的第一个地址,如果要调用的是类声明中的第三个虚拟函数,则将用虚拟函数表的第三个地址。
2 对函数指针的理解
要理解函数指针,要明白三个方面的问题。第一,怎样定义一个函数指针;第二,怎样去用定义的那个函数指针;第三,知道了怎样定义,也知道了怎么用,那么在什么情况下会用到函数指针。
第一,怎样定义一个函数指针?
假如有下面的一个函数声明:
int atoi( const char *string );
int (*pAtoi)(const char *string);
那么pAtoi就是指向atoi函数的指针,注意不能写成下面的形式:
int *pAtoi(const char *string);
一定要加上小括号。
还可以用typedef来简化定义。
typedef int (*_pAtoi)(const char *string);
_pAtoi pAtoi = atoi;
则pAtoi也是指向atoi函数的指针。
第二,怎样使用函数指针?
使用函数指针来调用函数,就把(*pAtoi)看作函数名就可以了
第三,在什么情况下使用?
举例说明,假设要实现一个名为CalculateTime的函数,该函数可以估算执行制定行数的代码所需要的时间,并希望所有的程序员都来使用这个函数,对于所有程序员来说,CalculateTime这个函数一部分代码是相同的,但是允许程序员提供自己的算法来估算时间,这样就必须把每个程序员自己的估算时间的函数指针传给CalculateTime函数,这样就用到了函数指针。
2 数据结构
2.1 用链表怎样来模拟 栈 和 队列 ?
模拟栈的操作,只要知道链表的头指针就可以了,入栈操作就是在头结点的前面插入节点,出栈操作就是删除头结点。
3 数据库
3.1 存储过程和存储函数的区别?
存储过程和函数本质上是没有区别的,不同的是函数的返回值在函数名本身,因此函数是可以嵌入在sql中使用的。这点才是最重要的区别。
3.2 写一个SQL语句,要求查出表中根据id排列的前20项,表名为user
select top 10 * from user order by id
3.3 说说你对存储过程的理解?
存储过程一些SQL语句经编译和优化后存储在数据库服务器中,使用时调用存储过程名即可。
存储过程的优点:
4 网络编程
4.1 描述socket的编程的过程
5 嵌入式
5.1 POS机项目