Почему нам нужен интерфейс (чистая виртуальная функция или абстрактный класс) в C++? Вместо абстрактного класса. Можем ли мы иметь базовый класс с установленной в нем виртуальной функцией и переопределять эту виртуальную функцию в производном классе. Каково было бы преимущество и недостаток вышеуказанного подхода (за исключением того, что мы можем создать объект базового класса)?Почему нам нужен интерфейс или чистая виртуальная функция в C++
ответ
Чистые виртуальные функции - это ваш способ сообщить пользователям вашего класса, что они не могут использовать класс самостоятельно, не наследуя его.
Очевидно, что вы можете делать то, что вы описали, и система собирается компилироваться и работать должным образом. Однако чистая виртуальная функция не является конструкцией для компилятора; это для людей, которые читают ваш код. Именно с этой конструкцией вы сообщаете читателям вашего кода, что они должны наследовать от вашего класса, потому что класс не предназначен для создания экземпляра самостоятельно.
Вы используете чистые виртуальные функции в ситуациях, когда для функции нет разумной реализации по умолчанию. Это говорит людям, которые реализуют ваш класс, что они должны предоставлять определенные функции, а компилятор помогает им в обнаружении ситуаций, когда они забыли предоставить реализацию.
Если, с другой стороны, вы предоставляете реализацию по умолчанию для виртуальной функции, которая должна быть реализована подклассом, а затем пользователи библиотеки классов забывают предоставить реализацию, проблема не будет обнаружена до тех пор, пока не будет запущена -время.
Чистые виртуальные функции предназначены, когда нет разумного способа реализации функции в базовом классе. Например:
class Shape {
public:
virtual float area() const = 0;
};
Вы можете написать производные классы, как Circle
и Rectangle
, которые реализуют area()
с использованием конкретных формул для этих видов форм. Но как бы вы реализовали area()
в самом Shape
, если бы это было не чисто виртуальное? Как вы вычисляете область фигуры, даже не зная, какова форма?
Если ваша функция может быть реализована (полезным способом) в базовом классе, тогда идите и реализуйте ее. Не все базовые классы должны быть абстрактными. Но некоторые из них просто по своей сути являются аннотация, как Shape
.
Спасибо, Но мой вопрос заключается в том, что вместо чистой виртуальной функции в базовом классе мы можем иметь виртуальную функцию (в вашем виртуальном плавающем пространстве кода() в базовом классе? И каково было бы преимущество и недостаток вышеуказанного подхода? – Sanjay
Вы * можете *, но тогда вы должны * реализовать * его в базовом классе, и в этом случае нет хорошего способа сделать это. Лучшее, что вы можете сделать, это выбросить исключение или вернуть фиктивное значение, например, ноль или NaN, но это приведет к ошибкам во время выполнения. Лучше предотвратить это во время компиляции. – Wyzard
Да, но мы можем оставить определение функции ничем, как фиктивная функция. и переопределить ту же функцию в производном классе с правильным определением (например, форма и круг, квадратный пример). – Sanjay
Интерфейс дает вам возможность указать набор поведений, которые все классы, реализующие интерфейс, будут совместно использоваться. Следовательно, мы можем определить переменные и коллекции (например, массивы) , которым не нужно заранее знать, какой конкретный объект они будут иметь, будет содержать только те объекты, которые реализуют интерфейс .
Как уже говорили другие, интерфейс представляет собой договорное обязательство реализовать определенные методы, свойства и события [...] Это достаточно удивительным преимуществом, чтобы оправдать эту функцию.
и here
(пожалуйста, обратитесь к этим очень хорошие объяснения)
- 1. C++ полиморфизм/чистая виртуальная функция
- 2. Чистая виртуальная функция Call
- 3. Почему нам нужен Icomparable интерфейс?
- 4. Ручка Чистая виртуальная функция Вызов в C#
- 5. Где чистая виртуальная функция, расположенная на C++?
- 6. C++ cli чистая виртуальная функция перегрузки (или отключение?)
- 7. Почему чистая виртуальная функция инициализируется 0?
- 8. Почему нам нужен готовый интерфейс в Struts2?
- 9. Чистая виртуальная функция, переопределенная унаследованным классом C++
- 10. чистая виртуальная функция с реализацией
- 11. чистая виртуальная функция, как она работает
- 12. Чистая виртуальная функция переопределения виртуальной функции
- 13. Чистая виртуальная функция, которая должна установить переменную
- 14. Есть ли чистая виртуальная функция в стандартной библиотеке C++?
- 15. Что такое частная чистая виртуальная функция?
- 16. Почему нам нужен Thread.MemoryBarrier()?
- 17. Общая библиотека C++: чистая виртуальная функция не вызывает ошибку связи
- 18. чистая виртуальная функция и абстрактный класс
- 19. Почему нам нужен частный вложенный интерфейс в java?
- 20. Ошибка «Чистая виртуальная функция, называемая» в шаблоне производного класса
- 21. Как отследить "libC++ abi.dylib: Чистая виртуальная функция называется!" в Xcode
- 22. Зачем нам нужен компилятор C++?
- 23. Многоадресная маршрутизация, зачем нам нужен интерфейс pimreg?
- 24. Что такое чистая виртуальная функция-член с телом функции?
- 25. C++ Вложенный шаблон стратегии, чистая виртуальная ошибка
- 26. Виртуальная функция
- 27. Почему нам нужен интерфейс, когда у нас есть абстрактный класс?
- 28. Виртуальная функция в C++
- 29. Виртуальная функция в C++
- 30. виртуальная функция в C++
Поскольку полиморфизм. –
Одним из основных преимуществ является возможность использования позднего связывания, которое позволяет использовать полиморфизм времени выполнения –
, вы просите «почему виртуальный» или «почему что-то должно быть чистым виртуальным»? – Hayt