Почему вы должны проверять, является ли Base частной или защищенной базой Derived? - PullRequest
1 голос
/ 26 мая 2020

Единственное различие между std::is_base_of<Base, Derived> и std::is_convertible<Derived*, const volatile Base*> состоит в том, что первое верно и тогда, когда Base является частным или защищенным базовым классом Derived. Но когда вам действительно нужно знать, является ли Base частной или защищенной базой? Почему пользователю следует заботиться о внутренней реализации класса?

Ответы [ 3 ]

1 голос
/ 26 мая 2020

В качестве одного из примеров рассмотрим

template <typename T>
struct Foo : T, Bar {};

. В этом случае больше не является деталью реализации, наследуется ли T от Bar (или любого другого класса), даже если наследование защищено.

Для частного наследования рассмотрим базовый класс, который выполняет некоторые бухгалтерские операции. Например, создание записей журнала каждый раз при создании экземпляра. Опять же, когда я наследую от второго типа, как в template <typename T> struct Foo : T {};, я хочу знать, наследуется ли T уже от класса бухгалтерского учета или мне нужно добавить это самому.

0 голосов
/ 26 мая 2020

Следующий класс:

class C
{
    operator int() { return 0; }
};

конвертируется в int:

constexpr bool is_int = std::is_convertible_v<C, int>; // true

Однако int не является основанием C:

constexpr bool is_base = std::is_base_of_v<int, C>; // false

Итак, ваша предпосылка, что единственная причина для существования этих функций:

Но когда вам действительно нужно знать, является ли Base частной или защищенной базой? Почему пользователь должен заботиться о внутренней реализации класса?

неверно. Есть и другие варианты использования.

0 голосов
/ 26 мая 2020

Ваши предположения неверны.

  1. std::is_convertible охватывает гораздо больше вариантов использования, чем std::is_base_of.

    Он также работает для определяемого пользователем оператора преобразования как примитивы.

    https://gcc.godbolt.org/z/JULbVf

  2. Если класс наследует в частном порядке базовый класс, который не является внутренней деталью реализации, но влияет на publi c интерфейс класса. Например, предотвращается преобразование в базовый класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...