In the following code, why doesn't dynamic_cast
produce a Base *
?
#include <cassert>
class BaseI;
class SystemI {
public:
virtual ~SystemI() {}
virtual void remove(BaseI *) = 0;
};
class BaseI {
public:
SystemI * system = nullptr;
virtual ~BaseI() {
system->remove(this);
}
};
class Base : public BaseI { };
class System : public SystemI {
public:
System() {
Base base;
base.system = this;
}
void remove(BaseI * basei) override {
Base * base = dynamic_cast<Base *>(basei);
assert(base != nullptr); // <-------------------- fails
}
};
int main() {
System sys;
}
My intent is to create a mechanism where components derived from BaseI
automatically remove themselves from the system upon deletion.