Я не понимаю следующее ограничение:Использование частного абстрактного метода в производном классе
class Base
{
virtual doFoo() = 0;
};
class Derived : public Base
{
public:
void doStuff() { doFoo(); } //compile error, doFoo is a private member of Base
};
Решение, конечно, повторно объявить элемент в производном классе, но это кажется несколько странным для меня:
class Derived : public Base
{
public:
void doStuff() { doFoo(); }
private:
virtual doFoo() = 0;
};
Почему я не могу использовать абстрактный виртуальный частный метод базового класса в производном классе без повторного объявления его? Это кажется чрезмерно жестким ограничением, потому что, если бы я использовал его, но не определил его, то Derived
все еще является абстрактным и для его создания некоторый дополнительный производный класс должен был бы предоставить doFoo
.
Интуитивно я бы сказал, что, не определяя его (или повторно объявляя его), я подразумеваю, что метод не используется и не является частью производного класса, но это больше для читателя кода, чем для компилятора. Или, может быть, компилятор тоже нуждается в этой информации, и это настоящая причина для этого?
Почему бы не использовать 'protected'? Я, вероятно, что-то пропустил –
Это основы инкапсуляции. Частный частный, вот и все.Если вы как разработчик классов хотите выставить что-то в подклассы, используйте protected, и если вы хотите подвергать свою функциональность всем клиентам (и подклассам в этом случае), используйте public. –
IMHO, частный виртуальный метод, не имеет большого смысла. Виртуальные средства, которые могут быть переопределены подклассами, а частные средства недоступны из базовых классов ... Вы имеете в виду защищенный вместо этого? –