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
Definiert im Header <type_traits>
template < class Base, class Derived >
struct is_base_of ;
(seit C++11)

std::is_base_of ist ein BinaryTypeTrait .

Falls Derived von Base abgeleitet ist oder beide die gleiche Nicht-Union-Klasse sind (in beiden Fällen unter Ignorierung von CV-Qualifizierern), liefert die Member-Konstante value den Wert true . Andernfalls ist value gleich false .

Wenn sowohl Base als auch Derived Nicht-Union-Klassentypen sind und sie nicht denselben Typ haben (unter Ignorierung von CV-Qualifizierern), sollte Derived ein vollständiger Typ sein; andernfalls ist das Verhalten undefiniert.

Falls das Programm Spezialisierungen für std::is_base_of oder std::is_base_of_v (seit C++17) hinzufügt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Hilfsvariablen-Template

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

Geerbt von std:: integral_constant

Member-Konstanten

value
[static]
true wenn Derived von Base abgeleitet ist oder wenn beide dieselbe Nicht-Union-Klasse sind (in beiden Fällen unter Ignorierung von CV-Qualifizierern), false andernfalls
(öffentliche statische Member-Konstante)

Member-Funktionen

operator bool
konvertiert das Objekt zu bool , gibt value zurück
(öffentliche Member-Funktion)
operator()
(C++14)
gibt value zurück
(öffentliche Member-Funktion)

Member-Typen

Typ Definition
value_type bool
type std:: integral_constant < bool , value >

Hinweise

std :: is_base_of < A, B > :: value ist true selbst wenn A eine private, protected oder mehrdeutige Basisklasse von B ist. In vielen Situationen ist std:: is_convertible < B * , A * > der geeignetere Test.

Obwohl keine Klasse ihre eigene Basis ist, ist std :: is_base_of < T, T > :: value wahr, da die Absicht des Traits darin besteht, die "is-a"-Beziehung zu modellieren, und T ein T ist. Trotzdem ist std :: is_base_of < int , int > :: value false , da nur Klassen an der Beziehung teilnehmen, die dieser Trait modelliert.

Mögliche Implementierung

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; // private oder mehrdeutige Basisklasse
}
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
    > {};

Beispiel

#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() {}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2015 C++11 das Verhalten könnte undefiniert sein, falls
Derived ein unvollständiger Union-Typ ist
die Basis-Charakteristik ist
std::false_type in diesem Fall

Siehe auch

prüft, ob ein Typ eine virtuelle Basis eines anderen Typs ist
(Klassentemplate)
prüft, ob ein Typ in einen anderen Typ konvertiert werden kann
(Klassentemplate)
spezifiziert, dass ein Typ von einem anderen Typ abgeleitet ist
(Konzept)