有如下程序:
#include<iostream> using namespace std; class A { public: A(int i) {x=i;} void dispa() {cout<<x<<’,’;} private: int x; }; class B: public A { public: B(int i): A(i+10) {x=i;} void dispb() (dispa(); cout<<x<<endl;} private: int x; }; int main() { B b(2); b.dispb(); return 0; }
运行时输出的结果是()。
A.10,2
B.12,10
C.12,2
D.2,2
参考答案:C
解析:
本题考查的知识点是:派生类的构造。执行开始,进入main()函数。第1句是声明一个B类对象b,并传入构造参数2,所以执行进入B的构造函数B(int i),形参i为2。由于B继承自A,所以首先执行进入A的构造函数A(int,i),形参i为2+10=12。函数中只有一条语句x=i,此时的x为类A的私有成员x,被赋值为12。执行返回到 B的构造函数,也是同样一条语句x=i;,不过这里的x为类B的私有成员x,被赋值为2。至此b的构造完成。执行返回主函数第2行,通过刚创建的对象b调用其成员函数dispb()。执行进入dispb(),第1条语句是dispa();,这是基类A的公有成员函数,执行进入dispa(),只有一条输出语句,此时由于在基类A中,所以输出的x为A的成员变量x,因此输出结果是“12,”。执行返回dispb()函数的第2条语句,这里输出的x是派生类B的成员变量x,即接着输出的结果是“2”。执行返回到主函数第3行,此时是一条return语句,主函数结束,程序执行完毕。注意,如果类中还定义有析构函数的话,此时就会被执行。故本题应该选择C。