Última atualização:2026-10-12
Funções virtuais puras e classes abstratas em C++¶
Sobre o autor:¶
Conta oficial do WeChat:

1.Funções virtuais puras e classes abstratas¶
Uma função virtual pura (ou função abstrata) em C++ é uma função virtual que não implementamos! Basta declará-la! Declara-se uma função virtual pura atribuindo 0 na declaração!
- Função virtual pura: uma função virtual sem corpo
- Classe abstrata: uma classe que contém funções virtuais puras
Uma classe abstrata só pode ser usada como classe base para derivar novas classes; não é possível criar objetos de uma classe abstrata; ponteiros e referências de classe abstrata -> objetos de classes derivadas da classe abstrata!
Exemplos de código: abstract_base.h, pure_virtual.cpp
2.Implementando uma classe abstrata¶
Dentro de uma classe abstrata: é possível chamar funções virtuais puras dentro de funções membro, mas não é possível usar funções virtuais puras dentro do construtor/destrutor.
Se uma classe é derivada de uma classe abstrata, ela só se torna não abstrata quando implementa todas as funções virtuais puras da classe base.
// A为抽象类
class A {
public:
virtual void f() = 0; // 纯虚函数
void g(){ this->f(); }
A(){} // 构造函数
};
class B : public A{
public:
void f(){ cout<<"B:f()"<<endl;} // 实现了抽象类的纯虚函数
};
Exemplo de código: abstract.cpp
3.Pontos importantes¶
-
Construtores não podem ser funções virtuais, mas destrutores podem ser destrutores virtuais
// 抽象类 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;} };Quando um ponteiro da classe base aponta para um objeto da classe derivada e o objeto é excluído, podemos querer que o destrutor apropriado seja chamado. Se o destrutor não for virtual, somente o destrutor da classe base será chamado.
4.Exemplo completo¶
A classe abstrata é herdada e implementada pela classe derivada!
Exemplo de código: derived_full.cpp
Tópicos relacionados¶
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Implementando polimorfismo de C++ em linguagem C | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事
- C++ restrict e otimização do compilador | C++那些事