Я не могу отвечать за конкретные компиляторы, вы должны спросить авторов компилятора.Даже если компилятор работает сейчас, он может не работать в следующей версии, поэтому я не буду полагаться на него.
Вам нужно такое поведение?
Позвольте мне предположить, что
- Вы хотите иметь возможность иметь указатель базового класса, не видя производного класса, и
- Не иметь v-таблицу в Base и
- Уметь очищать вуказатель базового класса.
Если это ваши требования, это можно сделать с помощью boost :: shared_ptr или вашей собственной адаптации.
В точке, где вы передаете указатель, вы передаетеboost :: shared_ptr с фактическим «Derived» снизу.При удалении он будет использовать деструктор, созданный при создании указателя, который использует правильное удаление.Вы, вероятно, должны предоставить Base защищенный деструктор, хотя и в целях безопасности.
Обратите внимание, что все еще существует v-таблица, но она находится в базе удаления общих указателей, а не в самом классе.
Комусоздайте свою собственную адаптацию, если вы используете boost :: function и boost :: bind, вам вообще не нужен v-стол.Вы просто получаете свой boost :: bind, чтобы обернуть базовый Derived * и вызовы функции delete на нем.