【问题标题】:Virtual method not being called未调用虚拟方法
【发布时间】:2012-06-21 21:15:00
【问题描述】:

我有一个名为 Panel 的基类,其中存储了有关窗口的一些信息,然后,我有所有控件的子类:按钮、标签等。在基类中,我有 virtual void ApplySchemeSettings(Scheme* scheme) { } 方法,即在Panel(Panel* parent) 构造函数中调用。但不是子类,而是基类 (Panel) 中的 ApplySchemeSettings

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");
    }
}

我不能将ApplySchemeSettings 声明为抽象,因为子类是由用户创建的。

【问题讨论】:

标签: c++ class inheritance virtual


【解决方案1】:

在构造函数内部,虚函数的行为并不像您预期​​的那样。特别是,在构造函数中对虚函数的任何调用都将始终解析对当前类中声明的函数版本的调用。原因是在对象构造过程中,首先构造一个基类,然后构造它的子类,然后构造它的子类,等等。因此,在对象构造过程中,派生类直到基类才被初始化。类构造函数完成运行。如果您能够调用虚函数并将其解析为基类构造函数内的最派生版本,那么您将调用一个尚未初始化的类的方法 - 甚至不是默认值数据成员的构造函数会被调用。

您需要找到其他方法来解决此问题。例如,您可能有一个两步构造,其中在调用构造函数之后调用某个 init() 方法。但是,没有办法安全地从构造函数中调用最派生版本的虚函数。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多