О динамическом преобразовании С++ с классом шаблона

У меня есть базовый класс A, класс B наследует от A, класс C, который является классом класса, наследуемым от A. class D, наследуется от C. Отношение выглядит следующим образом:

        A
       / \   
      B   C (template class)
           \
            D

Я могу создать объект O1 с помощью D-объекта D1, тогда я хочу, чтобы динамическое преобразование O1 было объектом C1 типа C1. Но я считаю, что это терпит неудачу. Мой вопрос в том, почему этот процесс терпит неудачу?

Затем я использую static_cast для создания объекта C типа C2 из объекта D D, и я проверил C2, имеет правильное значение из D2. Всегда ли удается преобразовать из типа D в тип C с помощью static_cast?

Спасибо!!!

Ответы

Ответ 1

Ну, так как C является шаблоном, он не является типом и не может использоваться как цель приведения (ни динамический, ни статический), и вы не можете извлечь из него. Вам нужно создать экземпляр шаблона класса. Полученный класс может использоваться в литье. То есть будет работать следующее:

struct A { };
template <typename T> struct C : A { };
struct D : C<int> { };

D d;
A& a = d;
C<int>& c = static_cast<C<int>&>(a); // or dynamic_cast, if `A` were polymorphic

Ответ 2

для объекта C1 типа C1. Но я нахожу, что это терпит неудачу.

Так как C является шаблоном, на самом деле нет "типа C". Скорее всего, есть C<int> или C<Foo>. (при условии, что у вас есть один шаблон arg). Шаблоны становятся только классами, когда они специализированы.

Итак, если D унаследовано от определенного типа C:

 class D : public C<int>
 {
 };

вы можете dynamic_cast до C<int>, но не сказать a C<float>

Чтобы лучше объяснить, ваше дерево наследования действительно

         A
       / | \
C<float>... C<int> 
             | 
             D

Итак, C не является родителем D, но C<int> в этом примере. Экземпляры C сами по себе вообще не существуют в среде выполнения, на самом деле существуют только те экземпляры, которые полностью определены C<type>.