研习了Linux公社发布的2013搜狗校园招聘笔试题,还是有些收获的。



 

 

//第一题:以下程序的输出是___________________
class Base
{
public:
 Base(int j):i(j){}
 virtual ~Base(){}
 void func1(){i *= 10; func2();}
 int getValue(){return i;}
protected:
 virtual void func2(){i++;}
protected:
 int i;
};

class Child:public Base
{
public:
 Child(int j):Base(j){}
 void func1(){i *= 100; func2();}
protected:
 void func2(){i += 2;}
};

int main()
{
 Base* pb = new Child(1); //pb指向的是Child类对象
 pb->func1(); //func1不是虚函数,所以调用Base::func1()
 cout<<pb->getValue()<<endl; //同理调用Base的函数
 delete pb;
 return 0;
}
//至于func1中的func2函数调用。
//一般成员函数默认会将this指针作为参数传递给自己,比如:
// class A {
//  public:
//   void fun() {i = 5;}
//  private:
//   int i;
// };
// void main {
//   A a;
//   a.fun();
// }
//那么调用a.fun()时,会将指向a自己的this指针传递给fun函数,所以
// void fun() {i = 5;}
//等价于
// void fun(A *this) {this.i = 5;}
//所以在上面题目相当于调用func1(this),然后调用this.func2()将this传递给func2函数,
//func2函数为虚函数,而这个this指针指向的实质是个Child对象,因此调用Child的func2函数。
//因此答案是12


 

 

//这个题目非常有意思。
//第四题:程序出错在什么阶段:
#include <iostream>
using namespace std;

int main()
{
 http://www.linuxidc.com
 cout<<"welcome to linuxidc"<<endl;

 return 0;
}

//A:编译时;B:运行时;C:编译和运行时都出错;D程序运行正常

//选D。因为http://www.linuxidc.com中//后面是注释,前面是标签(类似goto的标签)。(坑爹啊)

 




#include <iostream>
using namespace std;

class A
{
  public:
    void foo(){}
};

class B:virtual public A
{
  public:
    void foo(){}
};

class C:virtual public A
{
  public:
    void foo(){}
};

class D: public B,public C
{
  public:
    void foo(){}
};

int main(int argc, char *argv[])
{
  cout<<"A 的大小为: "<<sizeof(A)<<endl;
  cout<<"B 的大小为: "<<sizeof(B)<<endl;
  cout<<"C 的大小为: "<<sizeof(C)<<endl;
  cout<<"D 的大小为: "<<sizeof(D)<<endl;
  return 0;
}
//答案是1,4,4,8。需要继续充电...