正文

C++小题,你敢挑战吗(晕死你)?(更新中)2006-12-27 22:14:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/21534.html

分享到:

1.

class B{

protected:

 virtual void f( ) { cout << "B" << endl;}

public:

  void  g ( )  { f( ) ; }

};

 

class  D : public  B{

   protected :

         void f( ) { cout << "D" << endl ; }

}

 

int main ()

{

      D   d;

      d . g ( );

     return  0;

}

 

详细解答:既然是继承,g又没有覆盖,那么g就是同一个入口地址。而在调用f的时候,涉及到this指针。这个时候,this指针是基类指针。由于绑定了虚函数表,那么就会查询到实际上是指向派生类D的。于是得出结果。

这里如果把virtual去掉,那么直接进入基类的f()函数入口。

2.

class A{
public:
       A( ) { a=0;}
       void set_value(int x) { a=x;}
       void print(){cout<<a;}
private :


      int a;
 
};


class B:public A{
public:
     
     void print()
   {
        A::set_value(4);
        A::print();
   }
 
};


void main()
{
   B b;
   b.set_value(5);
   b.print();
}

详细解答:对于b的内存区,通过setvalue设置内存区中的成员a。然后通过A也是设置同一个内存区中的成员a为4,最后通过print输出。答案是4.

3.

 #include "iostream.h"
class A{
public:
      A( ) { a=0;}
      void set_value(int x) { a=x;f( );}
      void print( ){cout<<a;}
      void f( ){cout<<a<<endl;}
public :
 int a;
 
};
class B:public A{
public:
     
     void print()
   {
        A::set_value(4);
        A::print();
   }
     void f(){cout<<a<<endl;}

 
};
void main()
{
   B b; 
   b.set_value(5);
   b.print();
}

详细解答:这里b首先设置内存区的a为5,然后调用A::f,输出5。后来又设置为4,并进行输出。所以结果是5、4、4。

你敢挑战吗?留言哦

阅读(5057) | 评论(3)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册