О динамическом преобразовании С++ с классом шаблона
У меня есть базовый класс 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>
.