2010-05-10 3 views
1

У меня есть несколько на вопросах, касающихся динамического литья, TypeID() и шаблоныTypeId, динамическое литье (вентиляционное) и шаблоны

1) Каким образом TypeId не требует RTTI?

2) dynamic_cast на полиморфного типа:

  • Когда я потупив (Base для получения) с RTTI - компиляция проходит

    Когда RTTI выключен - я получаю предупреждение (предупреждение C4541: ' dynamic_cast»используется на полиморфного типа„“CBase с/gr-; непредсказуемое поведение может привести)

  • Когда я вентиляционный (Выведите на базу), с или без RTTI - компиляции проходит гладко

Я не понимаю, почему, когда я делаю upcast и RTTI выключен - у меня нет никаких предупреждений/ошибок!

3) dynamic_cast на NON полиморфного типа:

  • Когда я подавленным или без RTTI - компиляция терпит неудачу (ошибка C2683: 'dynamic_cast': 'CBase' не полиморфный тип)

НО

  • Когда я вентиляционный с или без RTTI - компиляция проходит гладко.

Каким образом происходит переход от NON полиморфного типа без RTTI?

4) Имеет ли «inline» перед функцией шаблона какой-либо эффект, т. Е. Когда компилятор компилирует эту функцию и видит, что она «встроена», она будет обрабатывать функцию как встроенную или она игнорируется?

Большое спасибо за помощь Дэвид

ответ

2

1) он требует RTTI. По крайней мере, если вы используете его на полиморфных классах ... это действительно его цель.

2) Если у вас нет RTTI на dynamic_cast, вы не можете проверить, является ли объект, который вы выполняете, фактически типом объекта, на который вы выполняете. В этом разница между dynamic_cast (по существу) и static_cast. Static_cast не проверяет это и, следовательно, менее безопасен, но быстрее. Таким образом, если у вас нет RTTI, он не может выполнять динамический откат, когда вы опускаетесь

Upcasting безопасен, потому что вы можете определять типы во время компиляции и, таким образом, вы можете повышать динамику с помощью dynamic_cast до базового класса.

3) dynamic_cast downcasting предназначен для полиморфных типов (например, типов с виртуальной функцией в них), и, таким образом, если класс не является полиморфным, он не будет работать. Поэтому, если у CBase нет виртуальной функции, вы не можете использовать dynamic_cast с ней.

По той же причине, что и для повышения.

Я думаю, вы должны прочитать немного о том, для чего предназначены разные приемы.

http://www.cplusplus.com/doc/tutorial/typecasting/

4) Да, это будет скомпилировать как инлайн.

Смежные вопросы