Голова: BINGO! Вы получили это полностью - это именно то, для чего он идеально подходит. Во многих встроенных средах внешние ограничения и / или сценарий общего использования заставляют программиста отделять выделение объекта от его инициализации. Скомпонованный вместе, C ++ называет это «экземпляр»; но всякий раз, когда действие конструктора должно быть явно вызвано без динамического или автоматического распределения, размещение нового - это способ сделать это. Это также идеальный способ найти глобальный объект C ++, привязанный к адресу аппаратного компонента (I / O с памятью) или для любого статического объекта, который по какой-либо причине должен находиться по фиксированному адресу.
Проблема оказалась связана с другими виртуальными функциями внутри исходных классов, которые были в моем коде. Код выше работает без проблем. Во время разработки я столкнулся с другими проблемами, поэтому я отправил ей новый код, который решает все эти проблемы с комментариями, упомянутыми рядом с ними:
// Top Level (Level 1)
class Abstract_Class_A
{
~Abstract_Class_A (); // To solve source type is not polymorphic” when trying to use dynamic_cast
};
class Abstract_Class_B: virtual public Abstract_Class_A
{
public:
uint8_t type;
};
class Abstract_Class_C: virtual public Abstract_Class_A
{
};
// Second Level (Level 2)
class Impl_Class_A : virtual public Abstract_Class_A
{
public:
double angle;
};
class Impl_Class_B: virtual public Abstract_Class_B, virtual public Impl_Class_A // Missing second virtual
{
};
class Impl_Class_C: virtual public Abstract_Class_C, virtual public Impl_Class_A // Missing second virtual
{
};
void test()
{
Impl_Class_B* test = new Impl_Class_B ();
}
Примечания:
[118 ]static_cast
, вместо этого следует использовать dynamic_cast
. Проверьте следующее обсуждение . dynamic_cast
вы должны добавить виртуальный деструктор в верхний класс. Проверьте следующее обсуждение об этом.