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
, которые реализуют функции. В функции мы создаем указатели трех классов , и , которые указывают на объекты класса , и соответственно . Затем мы вызываем функцию через эти указатели и выводим соответствующую информацию.Square
Triangle
draw()
main()
Shape
s1
s2
s3
Circle
Square
Triangle
draw()
Короче говоря, абстрактные классы и чисто виртуальные функции являются важными понятиями C++, они обеспечивают лучшую структуру и читабельность кода, а также позволяют нам определять общие интерфейсы и реализовывать их в производных классах. Использование абстрактных классов и чисто виртуальных функций может улучшить возможность повторного использования и удобочитаемость кода, а также избежать дублирования кода в производных классах. Таким образом, освоение использования абстрактных классов и чисто виртуальных функций является неотъемлемой частью программирования на C++.