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