Предположим, что у вас есть класс, который определяет виртуальные методы с открытым доступом. Можете ли вы изменить спецификатор доступа на свои методы переопределения? Я предполагаю, что нет. Ищите объяснение.Спецификатор доступа при переопределении методов
ответ
Да, вы можете, но это «не grok».
Посмотрите на Overriding public virtual functions with private functions in C++
Вы определенно можете. Но это не имеет смысла. Если это общедоступное наследование, вы всегда можете отбросить объект к его базе. Если это личное наследование, все базовые методы по умолчанию уже являются закрытыми. В случае защищенного наследования вы можете сделать базовый метод приватным, поэтому вы запрещаете возможным вызовам производных классов, но я действительно не понимаю, зачем ему это нужно.
Да, вы можете, и на самом деле вам даже не нужно переопределять или использовать виртуальные предметы.
class ABC {
public: // or this may be protected, no difference
void woof();
void moo();
};
class D : private ABC { // now woof and moo are private
public:
using ABC::woof; // using declaration to make woof public again
ABC::moo; // access declaration (deprecated) does the same
};
То же самое работает, если они также являются виртуальными. Или, как отмечали другие, поиск в виртуальной функции игнорирует доступ, указанный классом реализации; любой класс, который вы можете использовать, может обеспечить доступ во время компиляции.
С другой стороны, без специальных деклараций в D
, интерфейс ABC
public
действительно будет недоступен через D
, потому что вы не смогли бы к базовому типу ABC
. А если woof
и moo
были virtual
, вам нужно сделать переопределения private
, чтобы скрыть их. Возможно, это лучше отвечает на вопрос.
Я уверен, что это имеет большое значение, если они были «частными» в классе ABC. 'class D' должен иметь доступ к базовым членам, прежде чем он сможет их успешно назвать в объявлении' using'. OTOH, они могли быть «защищены» в «ABC», и использование все равно будет работать. –
@Ben: Извините, я имел в виду защищенный. Исправлена. – Potatoswatter
Ответ: вид. Вы можете изменить доступ только тех членов, к которым имеет доступ производный класс. Тип наследования не влияет - это контролирует доступ по умолчанию для унаследованных членов (к точке, следуя другим правилам).
Таким образом, вы можете сделать защищенные члены базового класса общедоступными или частными; или публичные члены базы, защищенные или закрытые. Однако вы не можете публиковать или защищать частных членов базы.
Пример:
class Foo
{
protected:
void protected_member();
private:
void private_member();
public:
void public_member();
};
class Bar : private Foo
{
public:
using Foo::protected_member;
using Foo::private_member;
using Foo::public_member;
};
int main(int, const char**)
{
Bar bar;
return 0;
}
Приведенный выше код вызывает следующую ошибку на г ++ 4.1.2:
main.c: 7: ошибка: 'недействительными Foo :: private_member()' является частным
main.c: 14: ошибка: в этом контексте
Кроме того, наиважнейшая не имеет ничего общего с изменением доступа метода. Вы можете переопределить виртуальный частный метод, вы просто не можете его вызывать из производного класса.
- 1. Бесконечная рекурсия при переопределении методов DataMapper
- 2. Ошибка компилятора при переопределении виртуальных методов
- 3. Когда использовать супер при переопределении методов ios
- 4. = default игнорирует спецификатор доступа?
- 5. Сохранять комментарии при переопределении
- 6. reflection.proxy недействителен при переопределении
- 7. Использование переопределении констант класса методов класса
- 8. Опуская спецификатор доступа в java
- 9. Спецификатор доступа для декларации интерфейса
- 10. Android: «Не удается разрешить метод« x() »« при переопределении методов суперкласса
- 11. Unknow ошибки при переопределении методов в UFT 12.51
- 12. Xamarin Android name collash при переопределении методов в FloatingActionButton.Behton
- 13. спецификация исключений при переопределении виртуальной функции
- 14. Списки доступа, определенные в конструкторе при переопределении onPaint method F #
- 15. При переопределении DefaultStyleKey необходимо?
- 16. Динамический полиморфизм при переопределении
- 17. Как просмотреть типы аргументов методов из суперклассов при переопределении методов в IntelliJ?
- 18. Контекст объекта доступа в переопределении SaveChanges
- 19. Хорошая практика при вызове методов доступа?
- 20. Спецификатор доступа наследования по умолчанию C++?
- 21. Может ли объект иметь спецификатор доступа?
- 22. Относительный спецификатор частного доступа в java?
- 23. Спецификатор доступа для отношений Has-A
- 24. Имеет ли спецификатор доступа для функции друга?
- 25. Полиморфизм - спецификатор доступа изменены в производном классе
- 26. Что такое спецификатор доступа класса реализации jsp?
- 27. Почему мы защитили спецификатор доступа в java?
- 28. AutoMapper/Castle - правила безопасности наследования, нарушаемые при переопределении члена
- 29. реализация пользовательских методов доступа
- 30. синхронизация нескольких методов доступа
Но, как указано в часто задаваемом FAQ parashift.com, это не относится к частному/защищенному наследованию. – Potatoswatter