Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I change the type of an object at runtime in C++ [closed]

Tags:

c++

object

I have 2 objects in my C++ program, both extending from the same parent class: class A, and class B, both extending class base.

Is it possible create an object using class A, and then change it later in the program to class B?

like image 619
Jon Avatar asked May 04 '15 20:05

Jon


2 Answers

Short answer, no. You cannot safely cast from A to B or B to A. You can safely cast to the base class since A IS_A base class and B IS_A base class but A and not a B and vice versa. There is no portable or safe way to do this. Whilst your compiler might let you do it and whilst it might appear to work the result of casting between to unrelated classes in this manner is undefined.

Incidentally, there is no reason why you can't add a cast constructor to allow A to be constructed from B and vice versa. That would be perfectly safe. You would just use the members of A to initialise the members of B and vice versa. Any members that are not common you'd have to deal with, probably be assigning them default values.

like image 165
evilrix Avatar answered Sep 30 '22 01:09

evilrix


The following code works:

#include <iostream>

class Base {};
struct A : public Base {int a;};
struct B : public Base {int b;};

int main()
{
  A *a = new A();
  a->a = 1;
  B *b = reinterpret_cast<B *>(a);
  std::cout << b->b << std::endl; 

  return 0;
}

This is extremely ugly though and won't work properly if A and B don't have the exact same memory layout. This works if you need a and b to be the same object. If you don't mind them being different objects and residing in different places in memory then you can just write a constructor in B that receives an object of type A or a conversion operator.

This sounds like a classic example of the XY Problem and there probably exists a much more elegant solution to your actual problem.

like image 45
Benjy Kessler Avatar answered Sep 30 '22 02:09

Benjy Kessler