I have the following code:
class A
{
};
class B : public A
{
public:
virtual void f() {}
};
int main()
{
A* a = new A();
B* b = static_cast<B*>(a);
b->f();
}
This program fails with a segmentation fault. There are two solutions to make this program work:
- declare f non-virtual
- do not call b->f() (i.e. it fails not because of the cast)
However, both are not an option. I assume that this does not work because of a lookup in the vtable.
(In the real program, A does also have virtual functions. Also, the virtual function is not called in the constructor.)
Is there a way to make this program work?
You can’t do that because the object you create is A, not B. Your cast is invalid– an object of A (created with new) cannot magically become an object of B.
Did you mean the A* a = new A() to actually be A* a = new B()? In that case, I would expect it to work.