Namespaces
Variants

std:: is_base_of

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definido en el encabezado <type_traits>
template < class Base, class Derived >
struct is_base_of ;
(desde C++11)

std::is_base_of es un BinaryTypeTrait .

Si Derived está derivado de Base o si ambos son la misma clase no-union (en ambos casos ignorando calificadores cv), proporciona la constante miembro value igual a true . De lo contrario value es false .

Si tanto Base como Derived son tipos de clase no unión, y no son del mismo tipo (ignorando calificadores cv), Derived debe ser un tipo completo ; de lo contrario, el comportamiento es indefinido.

Si el programa añade especializaciones para std::is_base_of o std::is_base_of_v (desde C++17) , el comportamiento es indefinido.

Contenidos

Plantilla de variable auxiliar

template < class Base, class Derived >
constexpr bool is_base_of_v = is_base_of < Base, Derived > :: value ;
(desde C++17)

Heredado de std:: integral_constant

Constantes miembro

value
[static]
true si Derived deriva de Base o si ambos son la misma clase no-union (en ambos casos ignorando calificadores cv), false en caso contrario
(constante miembro pública estática)

Funciones miembro

operator bool
convierte el objeto a bool , devuelve value
(función miembro pública)
operator()
(C++14)
devuelve value
(función miembro pública)

Tipos miembro

Tipo Definición
value_type bool
type std:: integral_constant < bool , value >

Notas

std :: is_base_of < A, B > :: value es true incluso si A es una clase base privada, protegida o ambigua de B . En muchas situaciones, std:: is_convertible < B * , A * > es la prueba más apropiada.

Aunque ninguna clase es su propia base, std :: is_base_of < T, T > :: value es verdadero porque la intención del rasgo es modelar la relación "es-un", y T es un T . A pesar de esto, std :: is_base_of < int , int > :: value es false porque solo las clases participan en la relación que este rasgo modela.

Implementación Posible

namespace details
{
    template<typename B>
    std::true_type test_ptr_conv(const volatile B*);
    template<typename>
    std::false_type test_ptr_conv(const volatile void*);
    template<typename B, typename D>
    auto test_is_base_of(int) -> decltype(test_ptr_conv<B>(static_cast<D*>(nullptr)));
    template<typename, typename>
    auto test_is_base_of(...) -> std::true_type; // base privada o ambigua
}
template<typename Base, typename Derived>
struct is_base_of :
    std::integral_constant<
        bool,
        std::is_class<Base>::value &&
        std::is_class<Derived>::value &&
        decltype(details::test_is_base_of<Base, Derived>(0))::value
    > {};

Ejemplo

#include <type_traits>
class A {};
class B : A {};
class C : B {};
class D {};
union E {};
using I = int;
static_assert
(
    std::is_base_of_v<A, A> == true &&
    std::is_base_of_v<A, B> == true &&
    std::is_base_of_v<A, C> == true &&
    std::is_base_of_v<A, D> != true &&
    std::is_base_of_v<B, A> != true &&
    std::is_base_of_v<E, E> != true &&
    std::is_base_of_v<I, I> != true
);
int main() {}

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2015 C++11 el comportamiento podría ser indefinido si
Derived es un tipo de unión incompleto
la característica base es
std::false_type en este caso

Véase también

verifica si un tipo es una base virtual de otro tipo
(class template)
verifica si un tipo puede convertirse a otro tipo
(class template)
especifica que un tipo deriva de otro tipo
(concept)