Рассмотрим следующий код:
class base {
public:
base() = default;
virtual int foo() { return 0; }
};
class derived : public base {
public:
derived() = default;
virtual int foo() { return 1;}
};
Скомпилировав это с помощью Clang 3.3, я получаю следующий вывод для vtable:
__ZTV7derived:
.long 0 <--- what is this?
.long __ZTI7derived
.long __ZN7derived3fooEv
Если я добавлю переключатель -fno-rtti
, я получу следующее:
__ZTV7derived:
.long 0 <--- what is this?
.long 0 <--- type info removed by -fno-rtti
.long __ZN7derived3fooEv
Это имеет смысл, поскольку TypeInfo теперь недействителен, но на что ссылается первый .long 0
? Кроме того, почему -fno-rtti
не удаляет информацию о типе полностью, а просто обнуляет ее? Я рассматриваю возможность написания прохода, чтобы сделать это вручную, но сначала я хотел бы узнать о последствиях этого (я выжимаю байты из встроенной платформы)
dynamic_cast
и множественное наследование. - person Sam Cristall   schedule 20.11.2013