Tôi có một lớp cơ sở được gọi là Panel, nơi có một số thông tin về cửa sổ được lưu trữ, sau đó, tôi có các lớp con cho tất cả các nút điều khiển: Nút, Nhãn, v.v. Trong lớp cơ sở, tôi có phương thức virtual void ApplySchemeSettings(Scheme* scheme) { }
, được gọi bên trong hàm tạo Panel(Panel* parent)
. Nhưng thay vì phân lớp, các ApplySchemeSettings
từ lớp cơ sở (Panel
) đang được gọi.Phương pháp ảo không được gọi là
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");
}
}
Tôi không thể khai báo ApplySchemeSettings
là trừu tượng vì các lớp con được tạo bởi người dùng.
'this-> ApplySchemeSettings (scheme());' loại con trỏ 'this' tại điểm gọi là' Panel * const', vì vậy nó gọi 'Panel :: ApplySchemeSettings'. Đạo đức của câu chuyện không bao giờ gọi hàm ảo từ hàm tạo của lớp cơ sở. –
http://stackoverflow.com/questions/6582239/avoiding-virtual-methods-in-constructor –
http://stackoverflow.com/questions/507043/virtual-function-invocation-from-constructor –