c++: dynamic_cast vs reinterpret_cast

John Tsiombikas nuclear at member.fsf.org
Tue Sep 11 16:07:30 EEST 2012


On Mon, Sep 10, 2012 at 11:02:08PM +0200, Giorgos Keramidas wrote:
> Αν σκεφτείς λίγο τι μπορεί να είναι το memory layout ενός DerivedClass
> μπορεί να μοιάζει με κάτι σαν:
> 
>     ADDRESS     +--------------------------------------+  <-- derived_pointer
>                 |                                      |
>     0x0800C000  |  DerivedClass::HigherFunction        |
>                 |  0x90 0x90 0x90                      |
>                 |                                      |
>     0x0800F000  |  +-----------------------------------+  <-- base_pointer
>                 |  |                                   |
>                 |  |  BaseClass::BaseFunction          |
>                 |  |  0x34 0x45 0x67 0x89 0x90 0x91    |
>                 |  |                                   |
>                 +--+-----------------------------------+

Ayto den isxyei gia pollous logous:
1) Object apo subclass mporei na ginei access meso pointer se base
class. An isxye ayto pou les, de tha ginotan na exoume polymorfismo se
data structures. Ena vector<BaseClass*> mporei na krataei instances apo
otidipote subclass tou BaseClass, ola ksekinane apo to idio pointer.

2) Exeis mpleksei to class layout me tis synartiseis. Oi synartiseis den
zoun se offset tou object pointer. Oi synartiseis yparxoun *mia* fora
mesa sto binary, sto .text, kai ta objects zoune sto heap opou eginan
allocate, kamia epafi.

> > Αυτό που θέλω είναι να μετατρέψω δείκτες Α* σε δείκτες Β*. Φαντάζομαι αυτό
> > μπορεί να γίνει τόσο με dynamic_cast όσο και με reinterpret_cast. Με ποιό από
> > τα δύο λοιπόν θα πρέπει να το κάνω, και γιατί?
> 
> Να μην το κάνεις.
> 
> Αν δύο classes δεν έχουν grand-parent, parent, κλπ. σχέση, το
> dynamic_cast θα κάνει κάτι undefined και σίγουρα πολύ λάθος.
> 
> Ξανασκέψου γιατί θέλεις να μετατρέψεις ένα άσχετο class σε ένα άλλο,
> εντελώς άσχετο, class.

Profanos theorisa stin arxiki apantisi oti DEN einai asxeta classes,
alla ayta ta pointers kratane instance enos subclass. Ayto to theorisa
mias kai o OP eipe oti ta A kai B einai abstract base classes, ara den
mporoun na ginoun instanciate.

To parakato einai perfectly valid:
class A {
public:
	int foo;
	A() : foo(10) {}
};

class B {
public:
	int bar;
	B() : bar(20) {}
};

class AB : public A, public B {
public:
	int xyzzy;
	AB() : xyzzy(42) {}
};

int main()
{
	A *a = new AB;

	B *b = (B*)a;
	printf("%d\n", b->bar);
	return 0;
}

-- 
John Tsiombikas
http://nuclear.mutantstargoat.com/


More information about the Linux-greek-users mailing list