Бауырлас класс өкілдері

I was going through this:- https://isocpp.org/wiki/faq/multiple-inheritance#mi-delegate-to-sister

Біреу маған бұл жағдайдың түсіндірілуін қалай бере алады және неге бұл орын алуы мүмкін?

8

6 жауаптар

Басқа жауаптардың екеуінен айырылған кілт - бұл жерде виртуалды мұра болу. Бұл толық нысанда тек Der1 және Der2 ортақ пайдаланылатын бір Base субобъектісі дегенді білдіреді.

Der1 және Der2 түрлерінің әрқайсысы осы базаның виртуалды функцияларының бірін іске асыруды қамтамасыз етеді және мұндай нысанның тек біреуі бар, Der1 және Der2 толық нысандағы екеуінің де мүшелерінің орындалуын қамтамасыз етеді.

Сіз шынымен Base түрінің мүше функциясын шақыратындықтан, ағылшынша сыныпқа жібере аласыз және бұл функция сіздің Base субобъектіңізде іске асады (сіздің ағайынды сыныбыңыз арқылы ). Der1 Der2 :: bar емес, керісінше Base :: bar деп аталмайтынын ескеріңіз, ол кейінірек соңғы пернетақтаға жіберіледі Der2 ішінде. Бұл, әрине, басқа жағдайларда соңғы жіберушінің жіберілуінен айырмашылығы жоқ:

struct base { virtual void f() = 0; };
struct d : base { void g() { f(); } };
struct d1 : d { void f() { std::cout << "here"; };
int main() {
   d1 x;
   x.g();//dispatches from 'd::g' to 'd1::f' which is below in the hierarchy!
         //yeah, right, everyone knows that... no magic here
}

Енді мұра виртуалды емес болса, толық үлгідегі екі Base субобъектілері болар еді, олардың әрқайсысы таза (таза) виртуалды функцияға ие болады және сіз тіпті объектіні ең көп алынатын түрі (егер виртуалды функцияларға қатысты анықтамалар берілген болса)

8
қосылды

Басқа жауаптардың екеуінен айырылған кілт - бұл жерде виртуалды мұра болу. Бұл толық нысанда тек Der1 және Der2 ортақ пайдаланылатын бір Base субобъектісі дегенді білдіреді.

Der1 және Der2 түрлерінің әрқайсысы осы базаның виртуалды функцияларының бірін іске асыруды қамтамасыз етеді және мұндай нысанның тек біреуі бар, Der1 және Der2 толық нысандағы екеуінің де мүшелерінің орындалуын қамтамасыз етеді.

Сіз шынымен Base түрінің мүше функциясын шақыратындықтан, ағылшынша сыныпқа жібере аласыз және бұл функция сіздің Base субобъектіңізде іске асады (сіздің ағайынды сыныбыңыз арқылы ). Der1 Der2 :: bar емес, керісінше Base :: bar деп аталмайтынын ескеріңіз, ол кейінірек соңғы пернетақтаға жіберіледі Der2 ішінде. Бұл, әрине, басқа жағдайларда соңғы жіберушінің жіберілуінен айырмашылығы жоқ:

struct base { virtual void f() = 0; };
struct d : base { void g() { f(); } };
struct d1 : d { void f() { std::cout << "here"; };
int main() {
   d1 x;
   x.g();//dispatches from 'd::g' to 'd1::f' which is below in the hierarchy!
         //yeah, right, everyone knows that... no magic here
}

Енді мұра виртуалды емес болса, толық үлгідегі екі Base субобъектілері болар еді, олардың әрқайсысы таза (таза) виртуалды функцияға ие болады және сіз тіпті объектіні ең көп алынатын түрі (егер виртуалды функцияларға қатысты анықтамалар берілген болса)

8
қосылды

Қысқаша жауап болады:
Класқа Der1 және Der2-ден алынған болса да, Base сыныптың бір данасы болады. Бұл виртуалды мұраға байланысты. Егер базалық класс абстрактілі сынып болмаса және конструкторға кейбір дәлелдер беру қажет болса, бұл шақыру Der1 және Der2 екеуінде де алынып тасталады және сіз бұл аргументтерді Біріктіру арқылы өткізуіңіз керек.

1
қосылды

Қысқаша жауап болады:
Класқа Der1 және Der2-ден алынған болса да, Base сыныптың бір данасы болады. Бұл виртуалды мұраға байланысты. Егер базалық класс абстрактілі сынып болмаса және конструкторға кейбір дәлелдер беру қажет болса, бұл шақыру Der1 және Der2 екеуінде де алынып тасталады және сіз бұл аргументтерді Біріктіру арқылы өткізуіңіз керек.

1
қосылды

Себебі бұл виртуалды функциялар және қоңырау VirtualFunction кестесінен жұмыс істеуге шақыру болып табылады. Бұл кестеде тек анықталған индекс бойынша іздеу. Бұл кесте деректерді нысан жасаған кезде алады және нысанның динамикалық түрі Қосылу болып табылады және бұл түрі базалық сыныптардан мұраланған барлық виртуалды функцияларға арналған жазбаларға ие болады.

1
қосылды

Себебі бұл виртуалды функциялар және қоңырау VirtualFunction кестесінен жұмыс істеуге шақыру болып табылады. Бұл кестеде тек анықталған индекс бойынша іздеу. Бұл кесте деректерді нысан жасаған кезде алады және нысанның динамикалық түрі Қосылу болып табылады және бұл түрі базалық сыныптардан мұраланған барлық виртуалды функцияларға арналған жазбаларға ие болады.

1
қосылды