Řešení quizů

Quiz 1

Příklad se nezkompiluje. Problém je ve volání:

call_foo_derived(&obj_base);

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í

call_foo(&obj_derived);

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í

call_functionality(&obj_derived);

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)