Рубрики

C ++ | Наследование Вопрос 12

#include<iostream>

using namespace std;

  

class Base

{

protected:

    int a;

public:

    Base() {a = 0;}

};

  

class Derived1:  public Base

{

public:

    int c;

};

  

  

class Derived2:  public Base

{

public:

    int c;

};

  

class DerivedDerived: public Derived1, public Derived2

{

public:

    void show()  {   cout << a;  }

};

  

int main(void)

{

    DerivedDerived d;

    d.show();

    return 0;

}

(A) Ошибка компилятора в строке «cout << a;»
(Б) 0
(C) Ошибка компилятора в строке «класс DerivedDerived: публичный Derived1, публичный Derived2»

Ответ: (А)
Пояснение: Это типичный пример алмазной проблемы множественного наследования . Здесь член базового класса «а» наследуется через Derived1 и Derived2 . Таким образом, в DerivedDerived есть две копии «a», что делает выражение «cout << a;» неоднозначным.

Решение в C ++ заключается в использовании виртуальных базовых классов. Например, следующая программа работает нормально и печатает

#include <iostream>
использование пространства имен std;

базовый класс
{
защищенный:
int a;
общественности:
Base () {a = 0;}
};

класс Derived1: виртуальная публичная база
{
общественности:
int c;
};

класс Derived2: виртуальная публичная база
{
общественности:
int c;
};

класс DerivedDerived: публичный Derived1, публичный Derived2
{
общественности:
void show () {cout << a; }
};

int main (void)
{
DerivedDerived d;
d.show ();
вернуть 0;
}

Тест на этот вопрос

Рекомендуемые посты:

C ++ | Наследование Вопрос 12

0.00 (0%) 0 votes