От того, с каким спецификатором доступа объявляется наследование
базового класса, зависит статус доступа к членам производного класса.
Общая форма наследования классов имеет следующий вид: #include <iostream.h> class X { protected: int i; int j; public: void get_ij () { cout << "Enter two numbers: "; cin >> i >> j; } void put_ij() { cout << i << " " << j << "\n"; } }; // в классе Y, i и j класса X становятся защищенными членами class Y: public X { int k; public: int get_k() { return k; } void make_k() { k = i*j; } }; /* класс Z имеет доступ к i и j класса X, но не к k класса Y, поскольку он является частным */ class Z: public Y { public: void f(); }; // i и j доступны отсюда void z::f() { i = 2; // нормально j = 3; // нормально } int main() { Y var; Z var2; var.get_ij(); var.put_ij(); var.make_k(); cout << var.get_k(); cout << "\n"; var2.f(); var2.put_ij(); return 0; }
Поскольку класс Y наследует класс X со спецификатором доступа public,
то защищенные элементы класса X становятся защищенными элементами
класса Y. Это означает, что они могут далее наследоваться классом Z, и
эта программа будет откомпилирована и выполнена корректно. Однако, если
изменить статус X при объявлении Y на private, то, как доказано в
следующей программе, класс Z не имеет права доступа к i и j и к
функциям get_ij() и put_ij(), поскольку они стали частными членами Y: Когда при объявлении класса Y перед базовым классом X имеется спецификатор доступа private, члены i, j, get_ij() и put_ij() становятся частными членами Y и поэтому не могут наследоваться классом Z, так что класс Z не имеет больше к ним доступа. |