若有以下程序: #include <iostream> using namespace std; class A { protected: int a; public: A() {

admin2010-03-29  31

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

答案1

解析 本题考核派生类的定义和使用。本程序有语法错误,这是由于类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”。
转载请注明原文地址:https://kaotiyun.com/show/yXjp777K
0

最新回复(0)