作者Chikei ( )
看板java
标题Re: [问题] 面试时被问到介面功能
时间Fri Oct 18 00:58:17 2013
1. C++那个不叫ADL(Koenig lookup),ADL指的是当现有scope里面找不到,
而且也不在member function里面的时候,怎麽扩大查找*unqualified* function name
举例来说
int main(int argc, char *argv[]){
std::cout << "hello world" << std::endl;
return 0;
}
这边的"<<"不是member function,而且scope是在std底下(std::operator<<),
如果没有ADL也没有using std,就会查不到"<<",这时候ADL便会启动,
根据函数参数(ostream/char*)的型别,自动扩大查找函数的scope。
那个例子只是很单纯的成员查找。
2. 钻石继承是*已被解决*的问题,只是因为C++在继承的时候有分virtual/non-virtual
让事情变得很复杂很容易让人搞混,所以一般能避则避。解决方法就是既然code有多条
路线,这时候让compiler逼你一定要选定一条路线就好。
3. 提高一下Java比率所以提一下Scala(咦)的解决方案,Scala的trait像是Java的
interface,但是trait可以有method implementation,也可以有field。
更进一步的是,有method implementation的trait一样可以被多重继承。
Scala对於trait的钻石继承处理方式是,根据简单的规则,自动把钻石拆成直线。
trait A
trait B extends A
trait C extends A
trait D extends B with C => chain super() call的code path会是D -> C -> B -> A
trait E extends C with B => E -> B -> C -> A
4. method signature collision,Java的态度就是...签名一样就是同一个人。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.34.138.208
※ 编辑: Chikei 来自: 1.34.138.208 (10/18 01:03)
1F:→ Schelfaniel:我觉得 Java 以後会朝向 Scala 的方向走 10/18 07:05