# Unity Base class to derivative function calls

This topic is 3790 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

I'm not sure where to find further reading on the matter - or what in particular to search for - so I thought I'd pick some brains around here and learn what I can on the topic, and hopefully get some terminology for the situation so I can better investigate on my own as well. I have a set of classes in my C++ project, where there is a base abstract class and numerous concrete classes derived from it (those concrete classes may have children classes as well, but for now let's leave it simple).
class BaseClass {
virtual stuff() = 0;
};

class SomeClass : public BaseClass {
};

class SomeOtherClass : public BaseClass {
};
Now, I want to make sure these classes ALWAYS do a certain call upon construction and upon destruction, which would then be a virtual function redefined by class. Since I don't want to have the end user (or me!) have to add the function call to every one of the derived constructors, as there could potentially be a huge number of them, I wanted to do something in the base class's constructor, like this:
class BaseClass {
};

class SomeClass : public BaseClass {
LoadStuff() { /* do things my way */ }
};

class SomeOtherClass : public BaseClass {
LoadStuff() { /* I'm so awesomely different! */ }
};
However, when I arrange it in this fashion, either it yells at me about LoadStuff being undefined, or (if I define LoadStuff with default functionality in BaseClass) it won't give me the desired effect of calling the derived class's version of LoadStuff(). Halp? :( I greatly appreciate any advice on the situation. Thanks! (Also, intense forums, I'm really enjoying my time here - very, very helpful and friendly community!)

##### Share on other sites
To work around this problem, there are a bunch of mechanisms that you can use to get the virtual method called for you.

For example, if your derived classes are created by a factory, the factory can call the additional initialization function before returning you the object.

Alternatively, you might choose to use something akin to the strategy pattern. For example, if I want a hierarchy based around an Enemy base class, I can create Enemys that behave differently by creating derived Brain's instead and leave Enemy as a concrete class e.g.

class Brain{    public:        virtual ~Brain() { }        virtual void connectSynapses() = 0;        // ...};class OgreBrain : public Brain{    public:        virtual void connectSynapses() { /* ... */ }        // ...};class Enemy{    public:        Enemy(const shared_ptr<Brain> &brain) :            brain_(brain)        {            assert(brain_);            brain_->connectSynapses(); // further initialiszation function        }        // ...    private:        shared_ptr<Brain> brain_;};

##### Share on other sites
I'm aware there's no implicit return type. I was simplifying down to the bare minimum so there wouldn't be any confusion regarding implementation-specifics. Something like a cross between pseudocode and real C++.

Upon reading that article you linked, I think I just realized the flaw in what I was attempting to do. I confused the order of constructor/destructor calls in building the object for some odd reason - I had assumed the constructor, for whatever reason, would be capable of dereferencing
this
to call a virtual function... may have been late night (early morning?) fatigue which resulted in me taking that assumption from the derivative constructor:

class SomeClass : public BaseClass {SomeClass(param a, param b) : BaseClass(a) { /* do something with b */ }}

So it must have appeared to my muddled mind that the base & abstract classes are instantiated in the object, then the derived constructor is called, then it does the assignments(? not sure on the term) after the :, which calls the BaseClass constructor within the SomeClass constructor.

Regardless, that clarifies that. However... now the new question arises: is there any way to do what I described earlier? (To prevent duplicating the code across every class.)

Much obligued and thanks for the help, wild_pointer.

Edit: the_edd must have had a premonition and answered me as I was typing my reply. :P Thanks! Much appreciated.

1. 1
2. 2
3. 3
Rutin
17
4. 4
5. 5
JoeJ
13

• 9
• 14
• 10
• 25
• 9
• ### Forum Statistics

• Total Topics
632645
• Total Posts
3007629
• ### Who's Online (See full list)

There are no registered users currently online

×