BG Development


Страници: (4) [1] 2 3 ... последна »  ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> Това защо работи?
dvader
Публикувано на: 30-11-2017, 08:55
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 3765
Регистриран на: 12.07.05



Те ви едно парченце код - начин да направим даден клас да бъде final без да ползваме С++ 11.
Това, което не вдявам е защо този начин работи?
Излиза, че ако имаме виртуално наследяване, то някъде надолу по веригата (в случая в CChild) конструктора се опитва явно да извика всички родителски конструктори но от какъв зор го прави - не би ли трябвало да вика само конструктора на CParent? Ако направя TMakeItFinal да наследява виртуално някакъв dongle клас и разкарам виртуалното наследяване от CParent нещата престават да работят, демек явно не е просто ей така, че щом някъде нагоре по веригата има virtual тогава разпъваме викането на конструкторите.

CODE
template<class T>
class TMakeItFinal
{
   friend T;
private:
   TMakeItFinal() { }
   TMakeItFinal(const TMakeItFinal&) { }
};
class CParent : public virtual TMakeItFinal<CParent>
{
};
class CChild : public CParent
{
};
int main(int, char**)
{
      CParent parent; // OK
      CChild child; // FAIL
      return 0;
}


Това мнение е било редактирано от dvader на 30-11-2017, 10:22


--------------------
I find your lack of faith disturbing
PM
Top
Дон Реба
Публикувано на: 30-11-2017, 09:05
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5818
Регистриран на: 11.11.06



дори не знам какво прави това =default, и ако случайно науча ще гледам да го забравя.
задълбаването в дълбините на С++ е най-безполезното нещо с което човек може да си губи времето.

PM
Top
ici
Публикувано на: 30-11-2017, 09:30
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 14926
Регистриран на: 06.06.04



Използването на виртуални базови класове не се прави ей така щото ни кефи. Това се прави за да нямаме две копия на един базов клас - така нареченият "diamond problem". В примера, така изваден от контекста въобще не виждам смисъл да се правят нещата по този начин.

https://www.cprogramming.com/tutorial/virtu...nheritance.html


--------------------
Everything you can imagine is real. Pablo Picasso
PMEmail PosterUsers Website
Top
dvader
Публикувано на: 30-11-2017, 09:51
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 3765
Регистриран на: 12.07.05



Опс, това =default е по-скоро по навик, това е именно С++ 11 icon_sad.gif
Сега ще го оправя


--------------------
I find your lack of faith disturbing
PM
Top
dvader
Публикувано на: 30-11-2017, 09:52
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 3765
Регистриран на: 12.07.05



QUOTE (ici @ 30-11-2017, 09:30)
Използването на виртуални базови класове не се прави ей така щото ни кефи.

Повтарям, за тия дето сега си пускат телевизорите: "начин да направим даден клас да бъде final без да ползваме С++ 11."

Това мнение е било редактирано от dvader на 30-11-2017, 09:53


--------------------
I find your lack of faith disturbing
PM
Top
Дон Реба
Публикувано на: 30-11-2017, 10:04
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5818
Регистриран на: 11.11.06



добре, а сигурен ли си че е финал наистина? в кода не си сложил ниаккви тестови виртуални функции, които да го демонстрират
PM
Top
ici
Публикувано на: 30-11-2017, 10:09
Quote Post


Group Icon
Име: Ивайло Илчев ики
Група: VIP
Ранг: Почетен член

Мнения: 14926
Регистриран на: 06.06.04



Ми виж сега. Final e java шит с който се решават проблемите с множественото наследяване. virtual басе клас е начина измислен в C++. Страничният ефект на virtual да имаме само едно копие на базовият клас действа като final. Това щеше да го разбереш ако беше прочел какво пише в линка който сложих.


--------------------
Everything you can imagine is real. Pablo Picasso
PMEmail PosterUsers Website
Top
Дон Реба
Публикувано на: 30-11-2017, 10:12
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5818
Регистриран на: 11.11.06



да това е така, но всуички знаем какво е виртуално наследяване.
аз не виждам от къв зор ще прави класа финал, но тая част за викането на конструкторите е очевидна: ако викнеш просто на бавозите класове, ще викнеш на прародителя два пъти конструктора, ето защо се прави няква магия там и викането не е тривиално като при обикновено наследяване
PM
Top
dvader
Публикувано на: 30-11-2017, 10:29
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 3765
Регистриран на: 12.07.05



QUOTE (Дон Реба @ 30-11-2017, 10:12)
ако викнеш просто на бавозите класове, ще викнеш на прародителя два пъти конструктора, ето защо се прави няква магия там и викането не е тривиално като при обикновено наследяване

Да, ама аз *не* наследявам CParent виртуално - от какъв зор магията ще става при мен?
Би трябвало да стане в CParent и съответно в неговият конструктор.
Прочее, защо тогава магията НЕ става ако самият TMakeItFinal наследява виртуално някой родител? Номера става именно и едствено ако CParent наследява виртуално.
Всъщност ако разкараме virtual целият трик престава да работи, както и би се очаквало.


--------------------
I find your lack of faith disturbing
PM
Top
Дон Реба
Публикувано на: 30-11-2017, 10:32
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 5818
Регистриран на: 11.11.06



ами тя част от магията става при него, ама само едната част, защото той не знае дали неговия родител не се наследява в децата оше веднъж по друга линия.
неговата част от сделката е ДА НЕ вика конструктора на виртуалния си родител, за да не стане колизия при ромбовидно наследяване. в неговите деца
PM
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (4) [1] 2 3 ... последна » Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2015 | BG Development | All Rights Reserved
RSS 2.0