Что означает значение = 0 в C ++ при объявлении методов? - PullRequest
3 голосов
/ 13 декабря 2011

Что означает = 0 часть этой декларации?

class KeyboardListener
{
  public:
    virtual bool keyPressed(void) = 0; 
} 

Ответы [ 4 ]

6 голосов
/ 13 декабря 2011

Это означает, что функция-член чисто виртуальная , что означает, что она вообще не имеет реализации.Следовательно, класс не может быть создан (он становится «абстрактным») и может использоваться только как базовый класс, чьи производные классы должны (в конечном итоге) реализовать функцию виртуального члена.

Примером может служитьабстрактный Animal класс с чисто виртуальной функцией-членом feed(): поскольку каждое животное всегда является экземпляром конкретного (т.е. производного) животного, ни одно чисто абстрактное животное не может существовать.И хотя у самого животного есть какой-то способ кормления, не существует универсальной базовой реализации, которая была бы общей для каждого животного - мы знаем только, что существует feed(), но она всегда должна выполняться конкретно конкретным производным животным.

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

1 голос
/ 13 декабря 2011

= 0 обозначает функцию как чисто виртуальный в отличие от простого виртуального.= 0 откладывает определение тела функции для производного класса.

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

С https://stackoverflow.com/a/1219618/866333:

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

1 голос
/ 13 декабря 2011

Вы должны реализовать эту функцию в производном классе, она чисто виртуальная (как следует из названия) и не имеет реализации (что подразумевается нулем, = 0 ) (есть случаи, когда они могут иметь реализации). Классы с чисто виртуальными функциями называются абстрактными базовыми классами или подобными. Они не могут быть созданы.

Чтобы использовать их, вы должны поместить в подкласс абстрактный класс и реализовать чистый виртуальный метод (ы) в производном классе.

1 голос
/ 13 декабря 2011

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

Чтобы использовать ваш пример, в классе KeyboardListener функция keyPressed(void) объявлена, но не реализована, то есть считается частьюинтерфейса и дочерние классы должны реализовывать функцию *, но сам родительский класс не .Нельзя создавать экземпляры родительского класса - родительский класс можно использовать только как указатель на экземпляр полностью определенного дочернего класса.

* При этом дочерние классы не являются для его реализации требуется - но если этого не произойдет, вы не сможете создать экземпляры этих дочерних классов или , только их потомки, которые в итоге реализуют keyPressed(void).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...