C++衍生類別對象記憶體布局

來源:互聯網
上載者:User

  • 問題提出:

類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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.