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。
你敢挑战吗?留言哦
评论