Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

public:quiz_solution [2018/02/24 19:10] (aktuální)
Řádek 1: Řádek 1:
 +====== Řešení quizů ======
  
 +===== Quiz 1 =====
 +
 +Příklad se nezkompiluje. Problém je ve volání:
 +<​code>​
 +call_foo_derived(&​obj_base);​
 +</​code>​
 +Protože ukazatel na předka se nemůže přetypovat na ukazatel na potomka.
 +Řešením je toto volání smazat, nedává smysl.
 +
 +===== Quiz 2 =====
 +
 +Příklad se nezkompiluje,​ metoda ''​void foo() const''​ ve třídě ''​derived''​ je private, proto ji není možno volat z funkce main.
 +Můžeme zkusit řešit tak, že třídě změníme přístupová práva na public. Ani tak ale není příklad úplně v pořádku, protože volání
 +<​code>​
 +call_foo(&​obj_derived);​
 +</​code>​
 +ve skutečnosti zavolá ''​base::​foo()'',​ ne ''​derived::​foo()'',​ což nejspíše není očekávané chování. Toto bychom vyřešili změnou metody ''​foo''​ ve tříde ''​base''​ na virtuální.
 +
 +===== Quiz 3 =====
 +
 +Příklad se nezkompiluje,​ metody ''​double square(double)''​ a ''​int square(double)''​ se liší jen návratovým typem, což není korektní přiřazení. Řešením by mohlo být jednu z těchto metod smazat. Lepším řešením by bylo nahradit metodu ''​double square(double)''​ metodou ''​void square(double,​ double &​)''​ a podobně pro ostatní metody. Existuje i řešení pomocí triků s přetěžováním konverzních operátorů,​ v němž by se funkce square nahradila třídou square, ale to jde nad rámec PB161 a nejspíše nemá příliš rozumné použití.
 +
 +===== Quiz 4 =====
 +
 +Příklad se sice zkompiluje, ale nedělá to, co bychom očekávali. Volání
 +<​code>​
 +call_functionality(&​obj_derived);​
 +</​code>​
 +totiž zavolá metodu ''​base::​functionality''​. Problém je v tom, že zatímco metoda ''​base::​functionality''​ je deklarována jako const, metoda ''​derived::​functionality''​ není. Nejde tedy o překrývání (overriding),​ které jsme zamýšleli. Opravou je deklarovat metodu ''​derived::​functionality''​ jako const a pro jistotu přidat ještě specifikátor ''​override'',​ díky kterému nám kompilátor pohlídá, že jde skutečně o překrývání.
 +
 +===== Quiz 5 =====
 +
 +Příklad se zkompiluje, ale má podobný problém jako předchozí příklad. Metoda ''​functionality''​ má opět různou signaturu v obou třídách, takže nejde ve skutečnosti o překrývání (overriding). Oprava je stejná jako v minulém příkladu.
QR Code
QR Code public:quiz_solution (generated for current page)