程序员面试题精选100题(62)-C/C++/C#面试题(5)

面试题 时间:2019-09-22 手机网站
  • return Name;
  • }
  • }
  • class Program
  • {
  • static void Main(string[] args)
  • {
  • ArrayList array = new ArrayList();
  • Person jim = new Person() {Name = "Jim"};
  • array.Add(jim);
  • Person first = (Person)array[0];
  • first.Name = "Peter";
  • Console.WriteLine(array[0].ToString());
  • }
  • }
  • 答案:Person的定义是一个struct,因此是一个值类型。在运行到语句Person first = (Person)array[0]的时候,first是array[0]的一个拷贝,first和array[0]不是一个实例。因此修改first对array[0]没有影响。

    问题(25):运行下面的C++代码,打印的结果是什么?

    
    
    1. class Base
    2. {
    3. public:
    4. void print() { doPrint();}
    5. private:
    6. virtual void doPrint() {cout << "Base::doPrint" << endl;}
    7. };
    8. class Derived : public Base
    9. {
    10. private:
    11. virtual void doPrint() {cout << "Derived::doPrint" << endl;}
    12. };
    13. int _tmain(int argc, _TCHAR* argv[])
    14. {
    15. Base b;
    16. b.print();
    17. Derived d;
    18. d.print();
    19. return 0;
    20. }

    答案:输出两行,分别是Base::doPrint和Derived::doPrint。在print中调用doPrint时,doPrint()的写法和this->doPrint()是等价的,因此将根据实际的类型调用对应的doPrint。所以结果是分别调用的是Base::doPrint和Derived::doPrint2。如果感兴趣,可以查看一下汇编代码,就能看出来调用doPrint是从虚函数表中得到函数地址的。