"Swap" baseclass of two similar Objects...

  • Thread starter .rhavin grobert
  • Start date
R

.rhavin grobert

guess you have two classes (A and B) and you have two objects (C1 and
C2) of a class C that is defined as

class C: public A, public B

can I *somehow* swap B of C1 and B of C2? To make myself clearer:
class C1 and C2 both have some area in memory that holds their B-Part
- i guess there must be somewhere in class C1 and C2 a kind of pointer
to that baseclasses. Eg. if you do a (B*) this inside C1 you get it.
What i want to do is swap the pointers.

Is that somehow possible?

thx in advance, .rhavin;)
 
M

Markus Schoder

guess you have two classes (A and B) and you have two objects (C1 and
C2) of a class C that is defined as

class C: public A, public B

can I *somehow* swap B of C1 and B of C2? To make myself clearer: class
C1 and C2 both have some area in memory that holds their B-Part - i
guess there must be somewhere in class C1 and C2 a kind of pointer to
that baseclasses. Eg. if you do a (B*) this inside C1 you get it. What i
want to do is swap the pointers.

Is that somehow possible?

Most implementations will not hold pointers to the base class objects but
instead aggregate them into one large object -- therefore it is not even
theoretically possible to do what you want.
 
A

Alf P. Steinbach

* Markus Schoder:
Most implementations will not hold pointers to the base class objects but
instead aggregate them into one large object -- therefore it is not even
theoretically possible to do what you want.

I think perhaps you misread what the OP wrote although it's not very
clear when he first refers to C1 as an object and then as a class; I'm
assuming C1 and C2 really are objects, of class C.

std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );

should then do the trick.

But it's not a good idea.

Class C may impose constraints on its B subobject, that depends on the
additional information present, and so swapping may violate the
constraints present in C and break C's class invariant. It's basically
a slice operation. And slicing is Evil(TM) and should be avoided.

Cheers, & hth.,

- Alf
 
M

Markus Schoder

* Markus Schoder:

I think perhaps you misread what the OP wrote although it's not very
clear when he first refers to C1 as an object and then as a class; I'm
assuming C1 and C2 really are objects, of class C.

Only the OP would now. I thought the OP wanted to specifically swap
pointers to the base class objects and not the actual content since it
seems obvious that you can swap the content.
std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );

should probably read

std::swap( *static_cast<B*>(&C1), *static_cast<B*>(&C2) );
 
R

.rhavin grobert

* Markus Schoder:





I think perhaps you misread what the OP wrote although it's not very
clear when he first refers to C1 as an object and then as a class; I'm
assuming C1 and C2 really are objects, of class C.


i meant class C: public A, B {...};

before:

C1 = [A1],[B1]
C2 = [A2],[B2]

after:

C1 = [A1],[B2]
C2 = [A2],[B1]

even if B has private stuff.
std::swap( *static_cast<B*>(C1), *static_cast<B*>(C2) );

should then do the trick.

But it's not a good idea.

Class C may impose constraints on its B subobject, that depends on the
additional information present, and so swapping may violate the
constraints present in C and break C's class invariant.

C and A are contolled by myself, so i should have a chance to correct
the odds;-)
It's basically a slice operation. And slicing is Evil(TM) and should be avoided.

I want to be evil ;-)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top