Последнее обновление:2026-10-12
C++ чисто виртуальные функции и абстрактные классы¶
Об авторе:¶
Личный официальный аккаунт:

1.Чисто виртуальные функции и абстрактные классы¶
Чисто виртуальная функция (или абстрактная функция) в C++ — это виртуальная функция, которую мы не реализуем! Мы только объявляем её! Чисто виртуальная функция объявляется путём присваивания 0 в объявлении!
- Чисто виртуальная функция: виртуальная функция без тела
- Абстрактный класс: класс, содержащий чисто виртуальные функции
Абстрактный класс может использоваться только как базовый класс для порождения новых классов; создавать объекты абстрактного класса нельзя. Указатели и ссылки на абстрактный класс -> указывают на объекты классов, порождённых от абстрактного класса!
Примеры кода: abstract_base.h, pure_virtual.cpp
2.Реализация абстрактного класса¶
Внутри абстрактного класса: в членской функции можно вызывать чисто виртуальную функцию, а внутри конструктора/деструктора использовать чисто виртуальную функцию нельзя.
Если класс порождён от абстрактного класса, он должен реализовать все чисто виртуальные функции базового класса, чтобы перестать быть абстрактным.
// A为抽象类
class A {
public:
virtual void f() = 0; // 纯虚函数
void g(){ this->f(); }
A(){} // 构造函数
};
class B : public A{
public:
void f(){ cout<<"B:f()"<<endl;} // 实现了抽象类的纯虚函数
};
Пример кода: abstract.cpp
3.Важные моменты¶
-
Конструктор не может быть виртуальным, а деструктор может быть виртуальным
// 抽象类 class Base { public: Base(){ cout << "Constructor: Base" << endl; } virtual ~Base(){ cout << "Destructor : Base" << endl; } virtual void func() = 0; }; class Derived: public Base { public: Derived(){ cout << "Constructor: Derived" << endl; } ~Derived(){ cout << "Destructor : Derived" << endl;} void func(){cout << "In Derived.func()." << endl;} };Когда указатель базового класса указывает на объект производного класса и объект удаляется, мы можем захотеть вызвать соответствующий деструктор. Если деструктор не является виртуальным, будет вызван только деструктор базового класса.
4.Полный пример¶
Абстрактный класс наследуется и реализуется производным классом!
Пример кода: derived_full.cpp
Похожие темы¶
- C++ утверждения assert | C++那些事
- C++ битовые поля | C++那些事
- Реализация полиморфизма C++ на языке C | C++那些事
- C++ константы const и его модификация | C++那些事
- C++ всё семейство const | C++那些事
- C++ оператор разыменования * | C++那些事
- C++ инициализация и присваивание | C++那些事
- C++ возврат нескольких значений | C++那些事
- C++ ключевое слово mutable | C++那些事
- C++ restrict и оптимизации компилятора | C++那些事