Как отмечено в комментариях этой программы, оба класса
ob.i = 20;
не ясно, на какую именно копию члена
Есть два способа исправить предыдущую программу. Первый состоит в применении оператора разрешения контекста (разрешения области видимости), с помощью которого можно "вручную" указать нужный член
/* Эта программа использует оператор разрешения контекста для выбора нужного члена i.
*/
#include
using namespace std;
class base {
public:
int i;
};
// Класс derived1 наследует класс base.
class derived1 : public base { public: int j;};
// Класс derived2 наследует класс base.
class derived2 : public base { public: int k;};
/* Класс derived3 наследует оба класса derived1 и derived2. Это означает, что в классе derived3 существует две копии класса base!
*/
class derived3 : public derived1, public derived2 {
public:
int sum;
};
int main()
{
derived3 ob;
ob.derived1::i = 10; // Контекст разрешен, используется член i класса derived1.
ob.j = 20;
ob.k = 30;
// Контекст разрешен и здесь.
ob.sum = ob.derived1::i + ob.j + ob.k;
// Неоднозначность ликвидирована и здесь.
cout << ob.derived1::i << " ";
cout << ob.j << " " << ob.k << " ";
cout << ob.sum;
return 0;
}
Применение оператора
Если два (или больше) класса выведены из общего базового класса, мы можем предотвратить включение нескольких его копий в объекте, выведенном из этих классов, что реализуется путем объявления базового класса при его наследовании виртуальным. Для этого достаточно предварить имя наследуемого базового класса ключевым словом
Для иллюстрации этого процесса приведем еще одну версию предыдущей программы. На этот раз класс
// Эта программа использует виртуальные базовые классы.
#include
using namespace std;
class base {
public:
int i;
};
// Класс derived1 наследует класс base как виртуальный.
class derived1 : virtual public base { public: int j;};
// Класс derived2 наследует класс base как виртуальный.
class derived2 : virtual public base { public: int k;};
/* Класс derived3 наследует оба класса derived1 и derived2. На этот раз он содержит только одну копию класса base.
*/
class derived3 : public derived1, public derived2 {
public:
int sum;
};
int main()
{
derived3 ob;