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

评论