std::is_base_of în C++

Verifică la compilare dacă o clasă este clasa de bază a alteia (sau aceeași clasă).

Sintaxă
#include <type_traits>
std::is_base_of_v<Baza, Derivata>

Ce face std::is_base_of

std::is_base_of_v<Baza, Derivata> este true dacă Derivata moștenește (direct sau indirect, public sau nu) clasa Baza. Este true și când cele două sunt aceeași clasă.

Se folosește în șabloane care acceptă doar tipuri dintr-o anumită ierarhie (de exemplu doar clase derivate din Figura). În C++20 conceptul std::derived_from face o verificare asemănătoare, dar cere moștenire publică.

Parametri

Parametru Descriere
Baza, Derivata Cele două clase.

Ce returnează

O constantă bool la compilare.

Exemple

Exemplul 1: O ierarhie de vehicule

#include <print>
#include <type_traits>

struct Vehicul {};
struct Masina : Vehicul {};
struct Taxi : Masina {};
struct Bicicleta {};

int main() {
    std::println("Vehicul -> Masina: {}", std::is_base_of_v<Vehicul, Masina>);
    std::println("Vehicul -> Taxi: {}", std::is_base_of_v<Vehicul, Taxi>);
    std::println("Masina -> Vehicul: {}", std::is_base_of_v<Masina, Vehicul>);
    std::println("Vehicul -> Bicicleta: {}", std::is_base_of_v<Vehicul, Bicicleta>);
    std::println("Masina -> Masina: {}", std::is_base_of_v<Masina, Masina>);
}

Rezultat

Vehicul -> Masina: true
Vehicul -> Taxi: true
Masina -> Vehicul: false
Vehicul -> Bicicleta: false
Masina -> Masina: true

Exemplul 2: Șablon care acceptă doar figuri

#include <print>
#include <type_traits>

struct Figura { virtual double arie() const = 0; virtual ~Figura() = default; };
struct Patrat : Figura { double l = 2; double arie() const override { return l * l; } };

template <class T>
void raport(const T& f) {
    static_assert(std::is_base_of_v<Figura, T>, "raport() acceptă doar figuri");
    std::println("arie: {}", f.arie());
}

int main() {
    raport(Patrat{});
    // raport(5);   // eroare la compilare: raport() acceptă doar figuri
}

Rezultat

arie: 4

Greșeli frecvente

  • Inversezi argumentele. Ordinea este is_base_of_v<Baza, Derivata>: întâi clasa de bază.

Comenzi înrudite

  • std::is_same: Verifică la compilare dacă două tipuri sunt exact același tip.
  • std::same_as: Concepte C++20: same_as cere exact același tip, convertible_to cere un tip care se poate converti în altul.
  • class: Definește un tip nou care grupează date (membri) și funcțiile care lucrează cu ele (metode); baza programării orientate pe obiecte.
  • virtual: Marchează o metodă care poate fi suprascrisă în clasele derivate; apelul printr-un pointer sau o referință la bază alege varianta tipului real.