Рубрики

Чистые виртуальные функции и абстрактные классы в C ++

Иногда реализация всей функции не может быть предоставлена в базовом классе, потому что мы не знаем реализацию. Такой класс называется абстрактным классом. Например, пусть Shape будет базовым классом. Мы не можем обеспечить реализацию функции draw () в Shape, но мы знаем, что каждый производный класс должен иметь реализацию draw (). Точно так же класс Animal не имеет реализации move () (при условии, что все животные двигаются), но все животные должны знать, как двигаться. Мы не можем создавать объекты абстрактных классов.

Чистая виртуальная функция (или абстрактная функция) в C ++ — это виртуальная функция, для которой у нас нет реализации, мы только объявляем ее. Чистая виртуальная функция объявляется путем присвоения 0 в объявлении. Смотрите следующий пример.

// Абстрактный класс

class Test

{   

    // Данные членов класса

public:

    // Чистая виртуальная функция

    virtual void show() = 0;

    

   /* Другие члены */

};

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

#include<iostream>

using namespace std;

  

class Base

{

   int x;

public:

    virtual void fun() = 0;

    int getX() { return x; }

};

  
// Этот класс наследует от Base и реализует fun ()

class Derived: public Base

{

    int y;

public:

    void fun() { cout << "fun() called"; }

};

  

int main(void)

{

    Derived d;

    d.fun();

    return 0;

}

Выход:

fun() called

Некоторые интересные факты:
1) Класс является абстрактным, если он имеет хотя бы одну чисто виртуальную функцию.
В следующем примере Test является абстрактным классом, потому что он имеет чисто виртуальную функцию show ().

// чисто виртуальные функции делают класс абстрактным
#include<iostream>

using namespace std;

  

class Test

{

   int x;

public:

    virtual void show() = 0;

    int getX() { return x; }

};

  

int main(void)

{

    Test t;

    return 0;

}

Выход:

Compiler Error: cannot declare variable 't' to be of abstract
 type 'Test' because the following virtual functions are pure 
within 'Test': note:     virtual void Test::show() 

2) У нас могут быть указатели и ссылки на абстрактный тип класса.
Например, следующая программа работает нормально.

#include<iostream>

using namespace std;

  

class Base

{

public:

    virtual void show() = 0;

};

  

class Derived: public Base

{

public:

    void show() { cout << "In Derived \n"; }

};

  

int main(void)

{

    Base *bp = new Derived();

    bp->show();

    return 0;

}

Выход:

In Derived 

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

#include<iostream>

using namespace std;

class Base

{

public:

    virtual void show() = 0;

};

  

class Derived : public Base { };

  

int main(void)

{

  Derived d;

  return 0;

}

Compiler Error: cannot declare variable 'd' to be of abstract type 
'Derived'  because the following virtual functions are pure within
'Derived': virtual void Base::show() 

4) Абстрактный класс может иметь конструкторы.
Например, следующая программа компилируется и работает нормально.

#include<iostream>

using namespace std;

  
// Абстрактный класс с конструктором

class Base

{

protected:

   int x;

public:

  virtual void fun() = 0;

  Base(int i) { x = i; }

};

  

class Derived: public Base

{

    int y;

public:

    Derived(int i, int j):Base(i) { y = j; }

    void fun() { cout << "x = " << x << ", y = " << y; }

};

  

int main(void)

{

    Derived d(4, 5);

    d.fun();

    return 0;

}

Выход:

x = 4, y = 5

Сравнение с Java
В Java класс можно сделать абстрактным, используя ключевое слово abstract. Точно так же функцию можно сделать чисто виртуальной или абстрактной, используя ключевое слово abstract. Видеть
Абстрактные классы в Java для более подробной информации.

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

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

Чистые виртуальные функции и абстрактные классы в C ++

0.00 (0%) 0 votes