類C繼承自基類A和基類B,現在有一個類C的對象,將其地址分別轉換為基類A的指標和基類B的指標,那麼這兩個指標的值相等嗎?
不相等。
由可見,衍生類別對象在記憶體中是把各個基類相關資訊放在一起,然後存放自己的成員。類C對象地址轉換為基類A和基類B的指標後它們的值如所示。
// cpp_learning.cpp : Defines the entry point for the console application.<br />//</p><p>#include <iostream><br />using namespace std;<br />class A<br />{<br />public:<br /> int a;<br /> int b;<br /> virtual void message()<br /> {<br /> cout << "BASE A" <<endl;<br /> }<br />};</p><p>class B<br />{<br />public:<br /> int c;<br /> int d;<br /> virtual void message()<br /> {<br /> cout << "BASE B" <<endl;<br /> }</p><p>};</p><p>class C:public A,public B<br />{<br />public:<br /> int e;<br /> virtual void message()<br /> {<br /> cout << "DERIVE C" <<endl;<br /> }<br />};</p><p>void castA(A a)<br />{<br /> cout << "A.a=" << a.a <<endl;<br /> cout << "A.b=" << a.b <<endl;<br /> a.message();</p><p>}</p><p>void castB(B b)<br />{<br /> cout << "B.c=" << b.c <<endl;<br /> cout << "B.d=" << b.d <<endl;<br /> b.message();<br />}</p><p>void castAref(A &a)<br />{<br /> cout << "A.a=" << a.a <<endl;<br /> cout << "A.b=" << a.b <<endl;<br /> a.message();</p><p>}</p><p>void castBref(B &b)<br />{<br /> cout << "B.c=" << b.c <<endl;<br /> cout << "B.d=" << b.d <<endl;<br /> b.message();<br />}</p><p>int main()<br />{<br /> C c;<br /> c.a = 1;<br /> c.b = 2;<br /> c.c = 3;<br /> c.d = 4;<br /> c.e = 5;<br /> C c1;<br /> A *pa = (A*)&c;<br /> B *pb = (B*)&c;<br /> A &a = c;<br /> B &b = c;</p><p> if ((int)pa == (int)pb)<br /> {<br /> cout << "pa == pb"<< endl;<br /> }<br /> else<br /> {<br /> cout << "pa != pb" <<endl;<br /> }</p><p> if ((int)&a == (int)&b)<br /> {<br /> cout << "&a == &b"<< endl;<br /> }<br /> else<br /> {<br /> cout << "&a != &b" <<endl;<br /> }</p><p> if ((int)&a == (int)pa)<br /> {<br /> cout << "&a == pa"<< endl;<br /> }<br /> else<br /> {<br /> cout << "&a != pa" <<endl;<br /> }</p><p> if ((int)&b == (int)pb)<br /> {<br /> cout << "&b == pb"<< endl;<br /> }<br /> else<br /> {<br /> cout << "&b != pb" <<endl;<br /> }</p><p> castA(c);<br /> castB(c);<br /> castAref(c);<br /> castBref(c);<br /> cout << "pa=" <<(int)pa << endl;<br /> cout << "pb=" <<(int)pb << endl;<br /> cout << "&c.e=" <<(int)&c.e << endl;<br /> cout << "sizeof A=" << sizeof(A) <<endl;<br /> cout << "sizeof B=" << sizeof(B) <<endl;<br /> cout << "sizeof C=" << sizeof(C) <<endl;</p><p> return 0;<br />}
pa != pb
&a != &b
&a == pa
&b == pb
A.a=1
A.b=2
BASE A
B.c=3
B.d=4
BASE B
A.a=1
A.b=2
DERIVE C
B.c=3
B.d=4
DERIVE C
pa=2293536
pb=2293548
&c.e=2293560
sizeof A=12
sizeof B=12
sizeof C=28