问题 单项选择题

若有以下程序:
#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”。

简答题
单项选择题