base::j; // Переменная j становится снова public-членом, а переменная k остается закрытым членом.
base::seti; // Функция seti() становится public-членом.
base::geti; // Функция geti() становится public-членом.
// base::i; // Неверно: нельзя повышать уровень доступа.
int а; // public-член
};
int main()
{
derived ob;
//ob.i = 10; // Неверно, поскольку член i закрыт в классе derived.
ob.j = 20; // Допустимо, поскольку член j стал открытым в классе derived.
//ob.k =30; // Неверно, поскольку член k закрыт в классе derived.
ob.a = 40; // Допустимо, поскольку член а открыт в классе derived.
ob.seti(10);
cout << ob.geti() << " " << ob.j << " " << ob.a;
return 0;
}
Обратите внимание на то, как в этой программе используются объявления доступа для восстановления статуса
C++ обеспечивает возможность восстановления уровня доступа для унаследованных членов, чтобы программист мог успешно программировать такие специальные ситуации, когда большая часть наследуемого класса должна стать закрытой, а прежний
Иногда иерархии С++-классов изображаются графически, что облегчает их понимание. Но порой различные способы изображения графов наследования классов вводят новичков в заблуждение. Рассмотрим, например, ситуацию, в которой класс
Как видите, стрелки на этом рисунке направлены вверх, а не вниз. Многие поначалу считают такое направление стрелок алогичным, но именно этот стиль принят большинством С++-программистов. Согласно стилевой графике C++ стрелка должна указывать на базовый класс. Следовательно, стрелка означает
Из этого графа следует, что класс
При наследовании нескольких базовых классов в С++-программу может быть внесен элемент неопределенности. Рассмотрим эту некорректную программу.
/* Эта программа содержит ошибку и не скомпилируется.
*/
#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.i = 10; // Это и есть неоднозначность: какой именно член i имеется в виду???
ob.j = 20;
ob.k = 30;
//И здесь тоже неоднозначность с членом i.
ob.sum = ob.i + ob.j + ob.k;
// И здесь тоже неоднозначность с членом i.
cout << ob.i << " ";
cout << ob. j << " " << ob.k << " ";
cout << ob.sum;
return 0;
}