maoxianmenlian的个人博客分享 http://blog.sciencenet.cn/u/maoxianmenlian

博文

一道考察重载、多态、继承的经典笔试题

已有 4227 次阅读 2013-11-1 10:49 |个人分类:C++|系统分类:科研笔记| 经典

据说是EMC2007年的笔试题


写出一段c++程序的输出。主要考察重载、多态、继承

代码如下:

class A

{

public:

   A(){ cout << "A:A" << endl; }

   ~A(){ cout << "A:~A" << endl; }

 

   virtual void f1() { cout << "A:f1" << endl; }

   void f2() { cout << "A:f2" << endl; }

};

 

class B: public A

{

public:

   B(){ cout << "B:B" << endl; }

   ~B(){ cout << "B:~B" << endl; }

 

   void f1() { cout << "B:f1" << endl; }

   void f2() { cout << "B:f2" << endl; }

};

 

class C: public B

{

public:

   C(){ cout << "C:C" << endl; }

   ~C(){ cout << "C:~C" << endl; }

 

   void f1() { cout << "C:f1" << endl; }

   void f2() { cout << "C:f2" << endl; }

};

 

int main()

{

   {

   C c; // A::A()  B::B()  C::C()

   A *p = &c;

   c.f1(); //C::f1()

   c.f2(); //C::f2()

   p->f1(); //C::f1()

   p->f2(); //A::f2(),,此处容易错误,因为A:f2有virtual关键字,而B:f2没有,因此很容易认为应输出B:f2

   p = new C(); //A::A()  B::B()  C::C()

 

   delete p; //A::~A(),注意:析构函数不是virtual,因此析构的时候不会多态,此处最容易搞错

   //注意:析构函数不是virtual,因此析构的时候不会多态

   //C::~C()  B::~B()   A::~A(),此处的析构是因为局部对象c

   }

 

   system("PAUSE");

   return 0;

}


https://blog.sciencenet.cn/blog-791354-738009.html

上一篇:《C++ Primer》第十五章文本查询示例
下一篇:笔试题集锦
收藏 IP: 125.71.200.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-18 14:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部