Предположим, у нас есть два класса: Base
и Derived
. Существует два метода: getX
и setX
, которые являются общедоступными и используют защищенный int x
для взаимодействия с пользователем. Base
конструкторы x
к 1, и Derived
строительные наборы х до 3.Производная переменная класса C++
class Base {
public:
Base();
int getX();
void setX(int n);
protected:
int x;
}
int Base::getX() {
return x;
}
void Base::setX(int n) {
x = n;
}
Base::Base() : x(1) {
}
class Derived : public Base {
public:
Derived();
}
Derived::Derived() : x(3) {
}
Derived
класс имеет полный доступ к методам из базы. Отлично.
Предположим, что по какой-то причине я не хочу, чтобы setX
был доступен для пользователей класса Derived
. Есть несколько способов, которые я думал об этом.
1) Redeclare setX
как закрытый в Derived
, поэтому затенение не позволяет пользователю полностью получить доступ к этому методу.
2) Redeclare x
как частный const int in Derived
. Однако это приводит к тому, что setX и getX работают с Base :: x.
3) Сделать базой :: setX виртуальной функцией, создать функцию Derived :: setX, которая ничего не делает.
Каков наилучший способ справиться с этим?
вы должны создать конструктор 'Base (int n)', тогда вы можете сделать 'Derived :: Derived(): Base (3) {}', как это теперь, ваш код не компилируется. –
Если вы используете метод 1, можно получить доступ к скрытой функции подробным образом: 'Derived d; d.Base :: SetX (9); '- эта возможность, желательная для вашего дизайна, или вы хотите ее предотвратить? – anatolyg