PDA

View Full Version : سوال: وراثت مجازی



asdasd123123
جمعه 02 خرداد 1393, 00:14 صبح
سلام. virtual public به چه معناست؟

class x: virtual public y
{
};

parvizwpf
جمعه 02 خرداد 1393, 00:20 صبح
http://stackoverflow.com/questions/419943/virtual-inheritance

rahnema1
جمعه 02 خرداد 1393, 16:22 عصر
http://www.sharefile.ir/uploads/1400849853.png (http://www.sharefile.ir/uploads/1400849853.png)

سلام
یک کلاس به صورت غیر مستقیم می تونه چند بار از یک کلاث ارث ببره .
مثلا کلاس C از هر دو کلاس A و B ارث می بره و A و B هم از V ارث می برند بنابراین C از V دو بار ( به صورت غیر مستقیم) ارث می بره
حالت اول موقعیه که از virtual استفاده نکنیم.
در این حالت شیئ ایجاد شده از نظر میزان اشغال حافظه شامل اعضای خودش به همراه اعضای A و B و همچنین دو تا شیئ از کلاس V خواهد بود

#include <iostream>
using namespace std;
struct V { int v;};
struct A : V { int a;};
struct B : V { int b;};
struct C : A, B { int c;};

int main()
{
A a1;
B b1;
C c1;
cout<<&c1.A::v<<","<<&c1.B::v<<endl;
}

اما در حالت دوم از virtual استفاده می کنیم.
در اینجا شیء ایجاد شده فقط شامل یک آبجکت از کلاس V خواهد بود


#include <iostream>
using namespace std;
struct V { int v;};
struct A : virtual V { int a;};
struct B : virtual V { int b;};
struct C : A, B { int c;};

int main()
{
A a1;
B b1;
C c1;
cout<<&c1.A::v<<","<<&c1.B::v<<endl;
cout<<&c1.v<<","<<&c1.v;
}

همچنین باید به نحوه دسترسی هم توجه کرد در حال اول باید برای دسترسی به عضو v حتما از :: باید استفاده کنیم در غیر اینصورت بین دو تا v اشتباه میشه
اما در حالت دوم چون فقط یک v داریم فرقی نمیکنه با :: به اون برسیم یا بدون ::

در مورد public : برای مشخص کردن ارث بری می تونیم از سه کلمه private,protected,public استفاده کنیم
public: باعث میشه اعضای public و protected از کلاس پایه به ترتیب به صورت public و protected به کلاس ارث برنده منتقل بشن
protected: باعث میشه اعضای public و protected از کلاس پایه به صورت protected به کلاس ارث برنده منتقل بشن
private: باعث میشه اعضای public و protected از کلاس پایه به صورت private به کلاس ارث برنده منتقل بشن

اینجا که ما از struct تنهااستفاده کردیم دسترسی به صورت public خواهد بود ولی اگر از کلمه class به صورت تنها استفاده می کردیم اعضا به صورت private منتقل می شدند