Я пишу набор смешанных классов (Pre и Post) и нет, я не могу использовать виртуальное наследование. Pre устанавливает объекты в конструкторе до Main :: Main (), а Post очищает объекты в деструкторе перед Main :: ~ Main ():
class Post {
public:
virtual ~Post() {
fprintf(stderr, "%p->%s\n", this, __PRETTY_FUNCTION__);
Main *m = dynamic_cast<Main *>(this);
assert(m != nullptr);
};
class Mixed : public Pre, public Main, public Post { };
Но когда Mixed :: ~ Mixed () вызывается, он вызывает Post :: ~ Post, и утверждение не выполняется. Почему и как я могу создать смешанный класс, который может выполнить некоторую очистку перед вызовом Main :: ~ Main ()?
Примечание: я мог бы хранить указатель на Main в классе Post, но это выглядит глупо.
Задача ещё не решена.
Других решений пока нет …