Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to change a C++ object's class after instantiation?

I have a bunch of classes which all inherit the same attributes from a common base class. The base class implements some virtual functions that work in general cases, whilst each subclass re-implements those virtual functions for a variety of special cases.

Here's the situation: I want the special-ness of these sub-classed objects to be expendable. Essentially, I would like to implement an expend() function which causes an object to lose its sub-class identity and revert to being a base-class instance with the general-case behaviours implemented in the base class.

I should note that the derived classes don't introduce any additional variables, so both the base and derived classes should be the same size in memory.

I'm open to destroying the old object and creating a new one, as long as I can create the new object at the same memory address, so existing pointers aren't broken.

The following attempt doesn't work, and produces some seemingly unexpected behaviour. What am I missing here?

#include <iostream>  class Base { public:     virtual void whoami() {          std::cout << "I am Base\n";      } };  class Derived : public Base { public:     void whoami() {         std::cout << "I am Derived\n";     } };  Base* object;  int main() {     object = new Derived; //assign a new Derived class instance     object->whoami(); //this prints "I am Derived"      Base baseObject;     *object = baseObject; //reassign existing object to a different type     object->whoami(); //but it *STILL* prints "I am Derived" (!)      return 0; } 
like image 779
Username Obfuscation Avatar asked Dec 19 '16 10:12

Username Obfuscation


People also ask

Can we initialize variable in class in C++?

We can put static members (Functions or Variables) in C++ classes. For the static variables, we have to initialize them after defining the class. To initialize we have to use the class name then scope resolution operator, then the variable name. Now we can assign some value.

What is object in C Plus Plus?

In C++, Object is a real world entity, for example, chair, car, pen, mobile, laptop etc. In other words, object is an entity that has state and behavior. Here, state means data and behavior means functionality. Object is a runtime entity, it is created at runtime.


2 Answers

You can at the cost of breaking good practices and maintaining unsafe code. Other answers will provide you with nasty tricks to achieve this.

I dont like answers that just says "you should not do that", but I would like to suggest there probably is a better way to achieve the result you seek for.

The strategy pattern as suggested in a comment by @manni66 is a good one.

You should also think about data oriented design, since a class hierarchy does not look like a wise choice in your case.

like image 154
Jean-Bernard Jansen Avatar answered Sep 19 '22 02:09

Jean-Bernard Jansen


Yes and no. A C++ class defines the type of a memory region that is an object. Once the memory region has been instantiated, its type is set. You can try to work around the type system sure, but the compiler won't let you get away with it. Sooner or later it will shoot you in the foot, because the compiler made an assumption about types that you violated, and there is no way to stop the compiler from making such assumption in a portable fashion.

However there is a design pattern for this: It's "State". You extract what changes into it's own class hierarchy, with its own base class, and you have your objects store a pointer to the abstract state base of this new hierarchy. You can then swap those to your hearts content.

like image 24
StoryTeller - Unslander Monica Avatar answered Sep 23 '22 02:09

StoryTeller - Unslander Monica