void showk() { cout << к << "\n"; }
};
// Члены i и j наследуются косвенно через класс derived1.
class derived2 : public derived1 {
int m;
public :
void setm() { m = i-j; } // правомерный доступ
void showm() { cout << m << "\n"; }
};
int main()
{
derived1 ob1;
derived2 ob2;
ob1.set (2, 3);
ob1.show();
ob1.setk();
ob1.showk();
ob2.set (3, 4);
ob2.show();
ob2.setk();
ob2.setm();
ob2.showk();
ob2.showm();
return 0;
}
Если базовый класс наследуется закрытым способом (т.е. с использованием спецификатора
// Эта программа не скомпилируется.
#include
using namespace std;
class base {
protected:
int i, j;
public:
void set (int a, int b) { i = a; j = b; }
void show() { cout << i << " " << j << "\n"; }
};
// Теперь все элементы класса base будут закрыты
// в рамках класса derived1.
class derived1 : private base {
int k;
public:
// Вызовы этих функций вполне законны, поскольку
// переменные i и j являются одновременно
// private-членами класса derived1.
void setk() { k = i*j; } // OK
void showk() { cout << k << "\n"; }
};
// Доступ к членам i, j, set() и show() не наследуется.
class derived2 : public derived1 {
int m;
public :
// Неверно, поскольку члены i и j закрыты в рамках
// класса derived1.
void setm() { m = i-j; } // ошибка
void showm() { cout << m << "\n"; }
};
int main()
{
derived1 ob1;
derived2 ob2;
ob1.set(1, 2); // Ошибка: нельзя вызывать функцию set().
ob1.show(); // Ошибка: нельзя вызывать функцию show().
ob2.set(3, 4); // Ошибка: нельзя вызывать функцию set().
ob2.show(); // Ошибка: нельзя вызывать функцию show().
return 0;
}
Несмотря на то что класс
Спецификатор
Спецификатор защищенного доступа может стоять в любом месте объявления класса, но, как правило,
class имя_класса {
private-члены
protected:
protected-члены
public:
public-члены
};
Напомню, что раздел защищенных членов необязателен.