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.