виртуальные функции и абстрактные классы - PullRequest
8 голосов
/ 16 апреля 2011

Я прочитал в своей книге:

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

Обязательно ли для абстрактного класса иметь виртуальную функцию? Почему?

В чем разница между чисто виртуальной функцией и виртуальной функцией и для чего она нужна?

Ответы [ 10 ]

7 голосов
/ 16 апреля 2011

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

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

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

2 голосов
/ 07 августа 2011

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

1 голос
/ 16 апреля 2011

Да, она должна иметь хотя бы одну чисто виртуальную функцию.

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

class MyAbstractClass
{
    virtual ~MyAbstractClass() = 0;

    virtual void f() 
    {
        IHaveAnImplementation(); 
        SoICannotBePure();
    }
};

// The destructor can unfortunately not be defined inline
MyAbstractClass::~MyAbstractClass() {}

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

1 голос
/ 16 апреля 2011

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

1 голос
/ 16 апреля 2011

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

0 голосов
/ 22 марта 2017

Чистая виртуальная функция - это функция, которая должна быть переопределена любым конкретным (т. Е. Неабстрактным) производным классом.Это указывается в объявлении с синтаксисом " = 0" в объявлении функции-члена.

Пример:

class AbstractClass {
public:
  virtual void AbstractMemberFunction() = 0; // Pure virtual function makes
                                             // this class Abstract class.
  virtual void NonAbstractMemberFunction1(); // Virtual function.

  void NonAbstractMemberFunction2();
};

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

0 голосов
/ 16 апреля 2011

В производном классе виртуальная функция может быть переопределена.

Чистая виртуальная функция должна быть переопределена в производном классе.

Нельзя создать экземпляр класса с чисто виртуальными функциями.

0 голосов
/ 16 апреля 2011

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

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

«Не чистая» виртуальная функция - это та, которая помечена ключевым словом virtual, ноопределение для функции предоставляется в базовом классе.Это означает, что базовый класс обеспечивает реализацию функции, которую любые подклассы могут переопределять при желании.Ключевое слово virtual позволяет полиморфизму работать, когда вы используете указатели базового класса, которые указывают на объекты производного класса.

0 голосов
/ 16 апреля 2011

чисто виртуальный означает, что метод не имеет реализации, поэтому он заставляет любой неабстрактный дочерний класс обеспечить эту реализацию.

0 голосов
/ 16 апреля 2011

Обязательно ли для абстрактного класса иметь виртуальную функцию? Почему?

Это зависит от используемого вами определения. Стандартное использование

Класс является абстрактным, если он имеет хотя бы одну чисто виртуальную функцию.

так что да, это обязательно. Неформально вы можете использовать другое определение, но тогда вы рискуете запутаться в контексте C ++.

В чем разница между чисто виртуальной функцией и виртуальной функцией и для чего она нужна?

Чистый виртуальный член:

  • должен быть переопределен во всех неабстрактных производных классах

  • можно оставить без определения (но дать определение возможно, даже в случае чистого виртуального деструктора).

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