在当前类的构造函数中调用其他类中定义的虚函数

时间:2012-12-10 17:40:10

标签: c++

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

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

问题>关于在OtherClass的构造函数中调用虚函数有问题吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

您可以更详细地了解here

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

调用A / B的虚函数与从OtherClass的构造函数或其他任何地方调用它无关。所以没问题。