Я увидел одну книгу на C++, в которой упоминается, что перемещение иерархии наследования с использованием статического литья более эффективно, чем использование динамического приведения.Статический литье против dymamic cast для пересечения иерархий наследования
Пример:
#include <iostream>
#include <typeinfo>
using namespace std;
class Shape { public: virtual ~Shape() {}; };
class Circle : public Shape {};
class Square : public Shape {};
class Other {};
int main() {
Circle c;
Shape* s = &c; // Upcast: normal and OK
// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)
Circle* cp = 0;
Square* sp = 0;
// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI
cp = static_cast<Circle*>(s);
if(typeid(s) == typeid(sp))
sp = static_cast<Square*>(s);
if(cp != 0)
cout << "It's a circle!" << endl;
if(sp != 0)
cout << "It's a square!" << endl;
// Static navigation is ONLY an efficiency hack;
// dynamic_cast is always safer. However:
// Other* op = static_cast<Other*>(s);
// Conveniently gives an error message, while
Other* op2 = (Other*)s;
// does not
} ///:~
Однако, как динамический и статический литой литой (как это реализовано выше) должен быть включен RTTI для навигации, например, чтобы работать. Просто динамический бросок требует, чтобы иерархия классов была полиморфной (т. Е. Базовый класс имел хотя бы одну виртуальную функцию).
Откуда этот коэффициент полезного действия для статического литья? В книге упоминается, что динамическое приведение является предпочтительным способом для тибетского понижения.
Ой мои глаза. Отступ? –
Передал бы ваше сообщение автору книги. – Ankur
C-Style cast '(Other *) s' по существу такой же, как' reinterpret_cast (s) 'в этом случае, поэтому он компилируется без предупреждения (вы, по сути, говорите компилятору, чтобы он не беспокоился, вы знаете, что вы) –
Attila