Classes with two parents

Started by
6 comments, last by GeekPlusPlus 19 years, 9 months ago
Hey, If I have a class inheriting from two parents, is there a way I can define an overload function in the second parent of a function in the first parent? e.g.

class CClassOne
{
public:
	void CFunction(void);
};

class CClassTwo
{
public:
	void CFunction(void);
};

class CClassThree: public CClassOne, public CClassTwo
{
public:
};
See, I have objects that inherit from just ClassOne, and objects that inherit from ClassOne and ClassTwo. Originally I was going to just virtual the function in ClassOne and override it in each of the children that also inherit from ClassTwo. But realized the functions of the children that inherit from ClassTwo will also all be the same, breaking the once and only once rule I love so much. Can I somehow tell it which is "more important"? Any ideas?
- Newb Programmer: Geek++
Advertisement
No.

EDIT: having reread it you may be looking for a way to bypass a diamond inheritance pattern, in which case it's really no and you should look at a better layout for your base classes.
Quote:I have objects that inherit from just ClassOne

Hmm...not in the source you listed. Is CClassTwo meant to be inheriting from CClassOne?

If the answer is no, then what you have is called multiple inheritance and should generally be avoided, especially if you've only just started with C++. It does have it's place but it's very easy to mess up.

However if the answer is yes, then CClassThree doesn't need to inheret from CClassOne, it will automatically get everything from CClassOne through CClassTwo. So you can do it like this (notice that you don't need to specify void in the parameters):

class CClassOne{public:	virtual void CFunction();};class CClassTwo : public CClassOne{public:        // Overrides CFunction() from CClassOne	virtual void CFunction();};class CClassThree: public CClassTwo{public:        // Overrides CFunction() from CClassTwo	virtual void CFunction();};


Now, from within CClassThree::CFunction() you can call the CFunction() from your base classes, that is CClassTwo::CFunction() and CClassOne::CFunction like follows:

void CClassOne::CFunction(){    // Do something}void CClassTwo::CFunction(){    CClassOne::CFunction();    // Do something extra}void CClassThree::CFunction(){    CClassTwo::CFunction();    // Do something extra}


Hope that helps!
"Voilà! In view, a humble vaudevillian veteran, cast vicariously as both victim and villain by the vicissitudes of Fate. This visage, no mere veneer of vanity, is a vestige of the vox populi, now vacant, vanished. However, this valorous visitation of a bygone vexation stands vivified, and has vowed to vanquish these venal and virulent vermin vanguarding vice and vouchsafing the violently vicious and voracious violation of volition. The only verdict is vengeance; a vendetta held as a votive, not in vain, for the value and veracity of such shall one day vindicate the vigilant and the virtuous. Verily, this vichyssoise of verbiage veers most verbose, so let me simply add that it's my very good honor to meet you and you may call me V.".....V
No, it's not a diamond, and no two doens't inherit from 1.
And I believe my situation warents the multiple inheritence.

It's owners (or containers, entities that OWN things). owners have very specialized features, a list of things it owns and methods of aquireing them and releasing them. class one is an entity item. two is the owner class

so class three is an entity of some sort which can contain things.

The reason I don't do them inline is because, well look at this inheritence model...

Entity |- Item |   |- Weapon |   |- Container |- Mobile     |- Player     |- npc


See all mobiles would be owners, but only containers would be owners in the item category. So you see how it gets messy.
Mobile->Owner->EntityContainer->Owner->Entity         \->Item->Entity?!

Doesn't work at all. =/

Also the world has a list of entities, it owns them, so it'd be an owner as well and not even an entity!

But either way, since there IS no way to define it. I assume my best bet is to just define each function in the owning children. Not so horrible.

And yes i've found some of the "not for newb" perks of multiple inheritence, like you really have to watch your type casting.

If you've got any suggestions i'm open to them. =)

Thanks,
- Newb Programmer: Geek++
Do you really have to call the two functions the same? If it's not really necessary, you have the solution right there. Maybe you already thought about that, but still...

--- Hellsp4wn ---AstralShadow | ScreamTech

VG Cats

It's a good point none the less, but I have thought of that. It's the same function really, but the owners have to be treated differently than non owners. Removing the entity from the world for example. Have to handle owner property if it has any, where non owners you don't. There's some others. But with that said...

I don't HAVE to, but that would leave the "other" function as a viable option for the wrong type. If you ever used it... Well only god can predict what would happen. =)

Actually right now I have a large case that says this type do this if that type do that, and if I left it in I could do that. But it just seems icky. Ya know?
- Newb Programmer: Geek++
Hi GeekPlusPlus.

You can specify which function is called by using a using declarator in CClassThree, this code demonstrates it.

class CClassOne{public:	void CFunction(void);};class CClassTwo{public:	void CFunction(void);};class CClassThree: public CClassOne, public CClassTwo{public:	using CClassTwo::CFunction;};


Hope that helps.
Ahh Sweet.

I knew there had to be something. Seemed to me this would pop up enough times someone would have done something.

Thanks a bunch,
- Newb Programmer: Geek++

This topic is closed to new replies.

Advertisement