2016-10-06 5 views
0

Почему нам нужен интерфейс (чистая виртуальная функция или абстрактный класс) в C++? Вместо абстрактного класса. Можем ли мы иметь базовый класс с установленной в нем виртуальной функцией и переопределять эту виртуальную функцию в производном классе. Каково было бы преимущество и недостаток вышеуказанного подхода (за исключением того, что мы можем создать объект базового класса)?Почему нам нужен интерфейс или чистая виртуальная функция в C++

+0

Поскольку полиморфизм. –

+0

Одним из основных преимуществ является возможность использования позднего связывания, которое позволяет использовать полиморфизм времени выполнения –

+0

, вы просите «почему виртуальный» или «почему что-то должно быть чистым виртуальным»? – Hayt

ответ

2

Чистые виртуальные функции - это ваш способ сообщить пользователям вашего класса, что они не могут использовать класс самостоятельно, не наследуя его.

Очевидно, что вы можете делать то, что вы описали, и система собирается компилироваться и работать должным образом. Однако чистая виртуальная функция не является конструкцией для компилятора; это для людей, которые читают ваш код. Именно с этой конструкцией вы сообщаете читателям вашего кода, что они должны наследовать от вашего класса, потому что класс не предназначен для создания экземпляра самостоятельно.

Вы используете чистые виртуальные функции в ситуациях, когда для функции нет разумной реализации по умолчанию. Это говорит людям, которые реализуют ваш класс, что они должны предоставлять определенные функции, а компилятор помогает им в обнаружении ситуаций, когда они забыли предоставить реализацию.

Если, с другой стороны, вы предоставляете реализацию по умолчанию для виртуальной функции, которая должна быть реализована подклассом, а затем пользователи библиотеки классов забывают предоставить реализацию, проблема не будет обнаружена до тех пор, пока не будет запущена -время.

10

Чистые виртуальные функции предназначены, когда нет разумного способа реализации функции в базовом классе. Например:

class Shape { 
public: 
    virtual float area() const = 0; 
}; 

Вы можете написать производные классы, как Circle и Rectangle, которые реализуют area() с использованием конкретных формул для этих видов форм. Но как бы вы реализовали area() в самом Shape, если бы это было не чисто виртуальное? Как вы вычисляете область фигуры, даже не зная, какова форма?

Если ваша функция может быть реализована (полезным способом) в базовом классе, тогда идите и реализуйте ее. Не все базовые классы должны быть абстрактными. Но некоторые из них просто по своей сути являются аннотация, как Shape.

+0

Спасибо, Но мой вопрос заключается в том, что вместо чистой виртуальной функции в базовом классе мы можем иметь виртуальную функцию (в вашем виртуальном плавающем пространстве кода() в базовом классе? И каково было бы преимущество и недостаток вышеуказанного подхода? – Sanjay

+0

Вы * можете *, но тогда вы должны * реализовать * его в базовом классе, и в этом случае нет хорошего способа сделать это. Лучшее, что вы можете сделать, это выбросить исключение или вернуть фиктивное значение, например, ноль или NaN, но это приведет к ошибкам во время выполнения. Лучше предотвратить это во время компиляции. – Wyzard

+0

Да, но мы можем оставить определение функции ничем, как фиктивная функция. и переопределить ту же функцию в производном классе с правильным определением (например, форма и круг, квадратный пример). – Sanjay

2

Интерфейс дает вам возможность указать набор поведений, которые все классы, реализующие интерфейс, будут совместно использоваться. Следовательно, мы можем определить переменные и коллекции (например, массивы) , которым не нужно заранее знать, какой конкретный объект они будут иметь, будет содержать только те объекты, которые реализуют интерфейс .

Here

Как уже говорили другие, интерфейс представляет собой договорное обязательство реализовать определенные методы, свойства и события [...] Это достаточно удивительным преимуществом, чтобы оправдать эту функцию.

и here

(пожалуйста, обратитесь к этим очень хорошие объяснения)

Смежные вопросы