[Продвинутые знания C++] Чистая виртуальная функция C++ и абстрактный класс


C++ чистая виртуальная функция и абстрактный класс

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

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

virtual void functionName() = 0;

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

Далее давайте посмотрим, как использовать абстрактные классы и чисто виртуальные функции на конкретном примере. Предположим, мы пишем графическую библиотеку, которая поддерживает рисование различных фигур, таких как круги, прямоугольники, треугольники и т. д. Мы можем определить абстрактный класс Shape, который имеет чисто виртуальную функцию draw(), что означает отрисовку графики. Мы можем получить несколько классов, таких как Circle, , , Squareи Triangleт. д., каждый из которых должен реализовывать draw()функции. Таким образом, мы можем Shapeединообразно управлять этими классами с помощью указателей или ссылок на классы, не заботясь об их конкретных реализациях. Это делает наш код намного понятнее и понятнее.

Вот пример кода:

#include <iostream>
using namespace std;

// 抽象类 Shape
class Shape {
    
    
public:
    virtual void draw() = 0; // 纯虚函数
};

// 派生类 Circle
class Circle : public Shape {
    
    
public:
    void draw() {
    
    
        cout << "Drawing a circle" << endl;
    }
};

// 派生类 Square
class Square : public Shape {
    
    
public:
    void draw() {
    
    
        cout << "Drawing a square" << endl;
    }
};

// 派生类 Triangle
class Triangle : public Shape {
    
    
public:
    void draw() {
    
    
        cout << "Drawing a triangle" << endl;
    }
};

int main() {
    
    
    Shape* s1 = new Circle();
    Shape* s2 = new Square();
    Shape* s3 = new Triangle();

    s1->draw(); // 输出 "Drawing a circle"
    s2->draw(); // 输出 "Drawing a square"
    s3->draw(); // 输出 "Drawing a triangle"

    delete s1;
    delete s2;
    delete s3;

    return 0;
}

В приведенном выше коде мы определили абстрактный класс Shape, в котором есть только одна чистая виртуальная функция draw(), означающая отрисовку графики. Мы также определяем три производных класса и Circle, которые реализуют функции. В функции мы создаем указатели трех классов , и , которые указывают на объекты класса , и соответственно . Затем мы вызываем функцию через эти указатели и выводим соответствующую информацию.SquareTriangledraw()main()Shapes1s2s3CircleSquareTriangledraw()

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

Guess you like

Origin blog.csdn.net/duck251/article/details/130535211