Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using virtual function in child after casting operation in C++

Tags:

c++

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:

  1. declare f non-virtual
  2. 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?

like image 663
Alexander Avatar asked Feb 09 '10 16:02

Alexander


2 Answers

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.

like image 91
Joe Avatar answered Sep 22 '22 13:09

Joe


You can't do that.

In your example, a is a object of class A. Not B. Casting it to B does not make it a B.

If you want to use polymorphic object behaviors, then you can give virtual function f to class A, and you can use code like A* a = new B(); Then you can use the virtual functions through the a pointer to get behavior from class B.

like image 21
Zan Lynx Avatar answered Sep 22 '22 13:09

Zan Lynx