设有如下程序: #include <iostream> using namespace std; class A { public: int i; display() {

admin2010-03-29  67

问题 设有如下程序:     #include <iostream>     using namespace std;     class A     {     public:        int i;        display()        {            cout<<"class A\n";        }     };     class B     {     public:         int i;         display()         {             cout<<"class B\n";         }     };     class C : public A,  public B     {         int j;     public:         int i;         show ( )         {             j = i * i;             display();         }     };     int main()     {            C demo;            demo.show();            return O;     }     则主程序运行时将(    )。

选项 A、因为变量i的重复定义而报错
B、因为对象demo间接调用display()函数时产生二义性而报错
C、因为类定义的语法错误而不能运行
D、没有语法错误,能够正常输出结果

答案2

解析 本题主要考察C++中多继承的工作方式和二义性的解决办法。在C++中,允许一个派生类从多个基类派生,这种继承方式称为多继承。多继承的定义格式如下:
   class<派生类名>:<继承方式><基类名1>,<继承方式2><基类名2>,…
   {<派生类类体>};
   但是,如果一个派生类的两个或多个基类中有某个同名成员,在派生类中对这个成员的访问就可能出现二义性;同时,如果一个派生类是由两个或多个基类派生出来的,而这几个基类又有一个共同的基类,对该基类进行访问时,也可能会出现二义性。本题程序中,类C是由类A和类B多继承得到的派生类,但其自身函数show()中调用了display()函数,而这个函数是同时出现在类C的两个基类中的,因此程序会出现二义性,编译器将无法确定调用哪一个display()函数来执行操作,因此报错。
   解决二义性的通常办法是通过作用域运算符“::”进行限定。
转载请注明原文地址:https://jikaoti.com/ti/4xW0FFFM
0

最新回复(0)