问题 单项选择题

若有以下程序: #include <iostream> using namespace std; class A { protected:int a; public:A(){ a=10;} }; class A1 : public A { public:A1(){ a=a+1;} }; class A2 : public A { public:A2 (){ a=a+2;} }; class B : public A1,public A2 { public:B(){}void print(){ cout<<a<<end1;} }; int main ( ) {B obj;obj.print();return 0; } 程序运行后的输出结果是( )。

A.产生语法错误

B.11

C.12

D.10

答案

参考答案:A

解析: 本题考核派生类的定义和使用。本程序有语法错误,这是由于类B中的 print函数中的语句“cout<<a<<end1;”要输出成员a的值,从而产生了二义性。分析如下:程序中定义了类A,类A1和类A2都是在类A的基础上以公有继承方式产生的派生类,而类B是在类A1和类A2的基础上经过多重继承方式产生的派生类,所以在类B中成员a有两个拷贝,系统无法区分是从A1继承过来的a,还从A2类继承过来的a。 修改方法有以下两种: ①在被访问的成员加上作用域分辨符“::”。将类B中的print()函数体中语句改为: cout<<A1::a<<end1; 或 cout<<A2::a<<end1; 但两者的输出结果不同,前者输出11,而后者输出12。 ②采用虚基类的方法。就是在定义A1和A2时,在派生方式前加上关键词“virtual”。

实验题
单项选择题 A型题