4
class A
{
public:
    ...
    virtual bool Function(..) const {...}
}

class B : public A
{
public:
    ...
    virtual bool Function(..) const {...}
}

class OtherClass
{
public:
    OtherClass(A& a)
    {
        m_bool = a.Function(..);
    }
private:
    bool m_bool;
}

假设类 A 或类 B 在构造类 OtherClass 之前已完全初始化。

Question> OtherClass的构造函数调用虚函数有问题吗?

4

3 回答 3

5

不,为什么会有任何问题?A传递(通过引用)到构造函数的实例OtherClass已经完全初始化,因此其上的虚函数按预期工作。

您听到的警告是关于在其构造函数中调用您正在构造的对象的虚函数;在这种情况下,虚拟调度被禁用,即在每个基类的构造函数中,调用的虚函数版本是其构造函数正在运行的基类之一。

这个想法是,在基类构造函数中,对象还没有成为它的最终类型;换句话说,当您构造一个从某个基类继承的对象时,它从“基本”类型开始,并在每个派生类构造函数运行时转换为派生类型。这反映了各种构造函数在运行时看到的虚函数版本。

您可以在此处更详细地了解它。

同样,这不会影响传递给构造函数的任何对象,因为它们已经完全构造,因此它们的“确定类型”(以及相应的虚函数集)已经完全建立。

于 2012-12-10T17:42:26.120 回答
2

如果函数是定义的而不是纯虚函数或抽象基类,则函数调用应该没问题。该a对象将按预期调用其虚函数,因此要回答您的问题,

于 2012-12-10T17:42:42.653 回答
0

调用A/B的虚函数与是从OtherClass的构造函数调用还是从其他任何地方调用都没有关系。所以没有问题。

于 2012-12-10T20:40:13.823 回答