Mam klasy bazowej o nazwie Panel, gdzie przechowywane są niektóre informacje o oknie, a następnie mam podklas dla wszystkich formantów: Button, Label itp. W klasie bazowej mam metodę virtual void ApplySchemeSettings(Scheme* scheme) { }
, która jest wywoływana w ramach konstruktora Panel(Panel* parent)
. Ale zamiast podklasy jest wywoływana ApplySchemeSettings
z klasy bazowej (Panel
).Metoda wirtualna nie jest wywoływana
class Panel
{
[...]
public:
virtual void ApplySchemeSettings(Scheme* scheme) { };
Panel(Panel* parent)
{
[...]
this->ApplySchemeSettings(scheme());
};
}
class Frame : public Panel
{
[...]
public:
void ApplySchemeSettings(Scheme* scheme)
{
this->border = scheme->GetBorder("FrameBorder");
}
}
Nie mogę zadeklarować ApplySchemeSettings
jako abstrakcyjny, ponieważ podklasy jest przez użytkownika.
'this-> ApplySchemeSettings (scheme());' typem tego "wskaźnika" w punkcie wywołania jest 'Panel * const', więc wywołuje' Panel :: ApplySchemeSettings'. Morał fabuły nigdy nie jest nazywany funkcją wirtualną od konstruktora klasy bazowej. –
http://stackoverflow.com/questions/6582239/avoiding-virtual-methods-in-constructor –
http://stackoverflow.com/questions/507043/virtual-function-invocation-from-constructor –